我有一个detatched实体,想要设置一些值。但在此之前,我想刷新实体,以确保从数据库中获取最新数据。我想出了这段代码。它在设置一些新值之前合并并刷新我的实体。
问题是,这会创建一个新对象。是否有更好,更简单的方法来实现这一目标?
@Entity
public class MyEntity{
public void setValueAndPersist(){
EntityManager em = ...
em.getTransaction().begin();
MyEntity newEntity = em.merge(this);
em.refresh(newEntity);
newEntity.setSomeVal("someVal");
em.commit();
}
}
答案 0 :(得分:1)
使用自己的类与数据库进行交互。不要在实体本身做到这一点!
Solution1:
您可以将@Version
用于当前对象。 https://weblogs.java.net/blog/2009/07/30/jpa-20-concurrency-and-locking。如果它不是最新版本并且您尝试合并它,则会出现异常。
Solution2:
您可以使用find(...)
http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#find%28java.lang.Class,%20java.lang.Object%29
使用当前Item中的类和ID从DB加载实际状态(如果已存在,则加载持久性上下文)。