Hibernate:在不同的会话中更新同一对象



我正在尝试做到这一点,但不起作用,谁能暗示我错了吗?最后,我失去了第一个更新

    EntityManager entityManager1 = JPAUtil.getEntityManagerFactory().createEntityManager();
    EntityManager entityManager2 = JPAUtil.getEntityManagerFactory().createEntityManager();
    Session session1 = (Session) entityManager1.getDelegate();
    Prova prova1 = session1.load(Prova.class, "020");
    Session session2 = (Session) entityManager2.getDelegate();
    Prova prova2 = session2.load(Prova.class, "020");
    prova2.setDes(prova2.getDes() + " 2");    
    prova1.setShortdes(prova1.getShortdes() + " 1");
    Transaction t2 = session2.beginTransaction();
    session2.update(prova2);
    t2.commit();
    session2.close();
    Transaction t1 = session1.beginTransaction();
    session1.update(prova1);
    t1.commit();
    session1.close();

作为上一个答案,您始终需要在保存之前检查对象的版本。Hibernate或JPA具有称为乐观锁定的功能来解决此问题。有关更多信息,请参阅以下代码和链接。

@Entity
public class Employee 
{
  @Id
  @GeneratedValue
  private Integer id;
  @Version
  private long version;
  private String name;
}

创建员工记录时,框架将自动创建版本值。首先让我们假设值为

[1,0," name1"]

在更新上,它更改为

[1,1," name2"]

在下一个更新上,它更改为

[1,2," name3"]

如果您尝试使用错误的版本更新数据

,则该框架将引发异常

链接对此有更多信息https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/optimistic-lock.html

添加以下代码以修复:

    t2.commit();
    session2.close();
    session1.refresh(prova1)
    prova1.setShortdes(prova1.getShortdes() + " 1");
Transaction t1 = session1.beginTransaction();
    session1.update(prova1);
    t1.commit();

这里发生的事情是:

首先您在Prova2上执行更新,从而导致des更新。

然后更新了Prova1 shortdes,但其独立状态是在更新Prova2之前的原始Prova状态。更新的算法是,它试图将prova1重新定为持久上下文,并意识到它与两个字段中的持久状态有所不同,因此第一个更新是遵守的,您最终将使用Shortdes设置,但DES又回到了其原始状态。

在此处阅读更多信息https://www.baeldung.com/hibernate-save-persist-update-merge-merge-saveorupdate

最新更新