这是我的代码:
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
有人能解释我为什么吗?
答案 0 :(得分:1)
我想你已经在数据库中有了一些条目后添加了@Version
- 注释列,因此为已经存在的记录创建了一些空值。
现在,hibernate无法比较版本。
我会尝试将所有null版本实体的版本列设置为1。
答案 1 :(得分:1)
我认为这个错误是由于我尝试删除一个锁定它的记录而引发的。尝试删除此行会将版本设置为null
,但数据库中的版本仍将设置为以前的编号。似乎hibernate核心认为null
值对于这种操作不可靠。
如果我必须做这种操作,我必须首先在这个实体上释放锁。
任何对此有更好了解的人都必须澄清这个问题。