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

时间:2019-02-17 11:27:51

标签: java hibernate hibernate-session

我正在尝试执行此操作,但是没有用,有人可以告诉我我错了吗? 最后,我失去了第一次更新

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

2 个答案:

答案 0 :(得分:2)

添加以下代码进行修复:

    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上的内容,但它的分离状态des是更新prova2之前的原始prova状态。更新算法是这样的,它尝试将prova1重新附加到持久性上下文,并意识到它在两个字段中与持久性状态不同,因此省略了第一次更新,最后设置了shortDes,但Des回到了其原始状态。

在这里https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate

了解更多

答案 1 :(得分:1)

作为上一个答案,您始终需要在保存之前检查对象的版本。 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