如何在Spring JPA中实现实体?实现或创建新的?

时间:2017-08-02 11:42:36

标签: spring hibernate jpa

我想知道在Spring项目中更新JPA实体的最佳做法是什么 - 更新原始实体或创建新实体?我看到了这两种方法:

  1. 使用原始 - 在原始实体中实现必要的字段,并将此更新的实体保存回存储库。
  2. 使用copy - 手动创建实体的新实例,将原始实体(+更新的字段)中的所有字段设置为新实体,并将实体保存回存储库。
  3. 您推荐使用/采用什么方法?为什么?

2 个答案:

答案 0 :(得分:0)

在更新时,标准方法是检索实体引用(如下所示)并在事务方法中进行更改:

private JpaRepository repo;

@Transactional(readOnly = false)
public void performChanges(Integer id){
     Entity e = repo.getOne(id);

     // alter the entity object
}

关于这个例子的一些事情:

  • 您希望尽可能使用getOne JpaRepository方法,因为它通常比findOne的{​​{1}}更快。唯一的技巧是你必须确保实体实际存在于具有给定id的数据库中。否则你会得到一个例外。关于CrudRepository方法不会发生这种情况,因此您需要就改变应用程序中单个实体的每个事务方法做出决定。
  • 您不需要在findOne上触发任何persistsave方法,因为更改将在提交事务时自动刷新..并且在方法返回时。

关于你的第二个选项,我不认为这很有用,因为你需要使用上面的方法来获取数据。如果您打算在事务之外使用该实体,那么您可以再次使用从上面的exmaple中检索到的实体,然后在事务上下文中再次需要它时执行EntityManager,从而执行持久性提供程序。

答案 1 :(得分:0)

获取实体然后只更新该实体是最简单的方法。这也比创建副本更快,因为EntityManager管理实体并且知道管理实体已存在于DB中(因此无需执行其他查询)。

无论如何,有第三种也是最快的方法:在executeUpdate对象上使用Query

entityManager
    .createQuery("update EntityName set fieldName = :fieldName where id = :id")
    .setParameter("fieldName", "test")
    .setParameter("id", id)
    .executeUpdate();

由于绕过持久化上下文,它更快