如何在JPA中处理OptimisticLockException

时间:2016-01-21 14:24:25

标签: java jpa

我有OptimisticLockException,如下所示(错误代码:entity = em.merge(entity);)因为用户在diffrenet浏览器选项卡中同时单击两次保存按钮。 注意:entity.getOid()不为null! 谁可以帮助我...

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;
}

提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是正确的JPA行为。 当用户第一次点击保存按钮实体版本字段增加时。因此,当用户单击第二个选项卡中的保存按钮版本不同时,JPA会生成乐观锁定异常。 如果用户在第一个选项卡中更改field1并保存并在第二个选项卡中更改field2并保存它而没有乐观异常,那么实体状态是什么? 您可以通知用户第二次该实体已被其他用户更改并重新加载新的实体状态或类似的内容......

答案 1 :(得分:0)

尝试在代码中添加:

...
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
...

希望这有助于。