【问题标题】:JPA - Refresh detatched entity before setting values and persistingJPA - 在设置值和持久化之前刷新分离的实体
【发布时间】:2014-05-14 19:38:28
【问题描述】:

我有一个分离的实体,想设置一些值。但在此之前,我想刷新实体以确保拥有数据库中的最新数据。我想出了这个代码。它会在设置一些新值之前合并并刷新我的实体。

问题是,这会创建一个新对象。有没有更好更简单的存档方式?

@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();
    }
}

【问题讨论】:

  • 如果您知道实体存在于 thh DB 中,您可以查找它:MyEntity entity = em.find(MyEntity.class, primary-key-here); 然后更新值 - 即 - 您跳过合并/刷新内容

标签: java jpa persistence entitymanager


【解决方案1】:

使用自己的类与数据库交互。不要在实体本身中这样做!

解决方案 1: 您可以将@Version 用于当前对象。 https://weblogs.java.net/blog/2009/07/30/jpa-20-concurrency-and-locking 。当它不是最新版本并且您尝试合并它时,您会得到一个异常。

解决方案 2: 你可以使用find(...)http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#find%28java.lang.Class,%20java.lang.Object%29

使用当前 Item 中的类和 ID 从 DB(或持久性上下文,如果其中已经存在)加载实际状态。

【讨论】:

  • 直到现在才知道通过@Version 进行乐观锁定。很有帮助的答案!
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2017-10-21
  • 1970-01-01
  • 2015-12-26
  • 2020-12-27
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多