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