我正在尝试执行此操作,但是没有用,有人可以告诉我我错了吗? 最后,我失去了第一次更新
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();
答案 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