3

这是我的代码:



EntityManager em = JPAUtil.createEntityManager();

   try {

     EntityTransaction tx = em.getTransaction();

     try {

           //do some stuff here
           tx.begin();
           List es = em.createNamedQuery("getMyEntities", MyEntity.class).getResultList();

           for (MyEntity e : es) {
               em.lock(e, LockModeType.OPTIMISTIC);
           }

           if (es.size() != 0) {

               em.remove(es.get(0));

           }

        tx.commit

     } finally {

        if (tx.isActive()) {
            tx.rollback();
        }

     }

   } finally {

      em.close();

   }

当我执行该代码时,我得到:

...


..........
Caused by: javax.persistence.OptimisticLockException: Newer version [null] of entity [[MyEntity#63]] found in database
    at org.hibernate.ejb.AbstractEntityManagerImpl.wrapLockException(AbstractEntityManagerImpl.java:1427)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1324)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
    ... 23 more

谁能解释一下为什么?

4

2 回答 2

1

我想您@Version在数据库中已经有一些条目之后添加了 -annotated 列,以便为已经存在的记录创建一些空值。现在休眠无法比较版本。

我会尝试将所有空版本实体的版本列设置为 1。

于 2013-09-09T13:47:54.160 回答
1

我认为这个错误是由于我试图删除一个有锁的记录而引发的。尝试删除此行,会将版本设置为null,但数据库中的版本仍设置为以前的数字。null对于这种操作,hibernate 内核似乎认为值不可靠。

如果我必须做这种操作,我必须先释放这个实体上的锁。

任何对此有更好了解的人都必须澄清这个问题。

于 2013-09-10T05:45:36.087 回答