JPA - 在设置值和持久化之前刷新detatched实体

时间:2014-05-14 19:38:29

标签: java jpa persistence entitymanager

我有一个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();
    }
}

1 个答案:

答案 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加载实际状态(如果已存在,则加载持久性上下文)。