我想知道在Spring项目中更新JPA实体的最佳做法是什么 - 更新原始实体或创建新实体?我看到了这两种方法:
您推荐使用/采用什么方法?为什么?
答案 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
上触发任何persist
或save
方法,因为更改将在提交事务时自动刷新..并且在方法返回时。 关于你的第二个选项,我不认为这很有用,因为你需要使用上面的方法来获取数据。如果您打算在事务之外使用该实体,那么您可以再次使用从上面的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();
由于绕过持久化上下文,它更快