Java 如何处理JPA中的OptimisticLockException
我有OptimisticLockException,如下代码所示(错误代码:entity=em.merge(entity);),因为当用户在diffrenet浏览器选项卡上同时单击两次save按钮时。 注意:entity.getOid()不是null强> 谁能帮我Java 如何处理JPA中的OptimisticLockException,java,jpa,Java,Jpa,我有OptimisticLockException,如下代码所示(错误代码:entity=em.merge(entity);),因为当用户在diffrenet浏览器选项卡上同时单击两次save按钮时。 注意:entity.getOid()不是null 谁能帮我 public static synchronized KirKiraciSozlesmeYeniKayitForm kaydet(KirKiraciSozlesmeYeniKayitForm form, EntityManager em)
public static synchronized KirKiraciSozlesmeYeniKayitForm kaydet(KirKiraciSozlesmeYeniKayitForm form, EntityManager em) {
KirKiraciSozlesme entity = new KirKiraciSozlesme();
UtilInsCore.copyProperties(form, entity);
if (entity.getOid() == null) {
Long oid = DBUtil.getSeqNextValue(em, "KIR_KIRACI_SOZLESME_SEQ");
entity.setOid(oid);
}
entity = em.merge(entity);
em.flush();
UtilInsCore.copyProperties(entity, form);
return form;
}
提前感谢。请尝试在代码中添加以下内容:
...
em.lock(entity, LockModeType.PESSIMISTIC_WRITE);
if (entity.getOid() == null) {
Long oid = DBUtil.getSeqNextValue(em, "KIR_KIRACI_SOZLESME_SEQ");
entity.setOid(oid);
}
entity = em.merge(entity);
em.getTransaction().commit();//To unlock the Entity
...
希望这有帮助。这是正确的JPA行为。 当用户第一次单击“保存”按钮时,“实体版本”字段增加。所以,当用户在第二个选项卡中单击save按钮时,版本不同,JPA生成乐观锁异常。 如果用户在第一个选项卡中更改
field1
并保存,在第二个选项卡中更改field2
并保存,实体状态将是什么?
您可以在第二次通知用户,该实体已被其他用户更改,并重新加载新实体状态或类似的内容…问题是什么?我需要解决此场景为什么用户希望在问题乐观时执行悲观锁定?根据我的研究,这是正确的JPA行为。在这种情况下,我应该在捕捉区给你留言。谢谢