我正在使用带有@Version (OptimisticLock) 的JPA 编写一个常规的JEE8 应用程序。我的 DAO 是一个标有 @Transactional(value = TxType.REQUIRED) 的 CDI bean
当更新发生冲突时:org.hibernate.StaleObjectStateException应该包含在javax.persistence.OptimisticLockException中,但事实并非如此。
我收到一个javax.transaction.RollbackException,原因是org.hibernate.StaleObjectStateException。
这种事怎么可能?
是预期的javax.persistence.OptimisticLockException吗?它无处不在(在所有异常原因链中)。
在 Wildfly 10 和 14 上测试:休眠 5.0.10 和 5.3.6
我正在做的是使用子表 ActorProperties 更新一个演员。Actor 是带有 @Version 和 TimeStamp 的那个。我做这样的事情:
public Supplier<Long> updateActorOptimiticLock(Actor actor) {
Map<String,Object> hints = new HashMap<String,Object>();
hints.put("javax.persistence.fetchgraph", em.getEntityGraph("actor with accesses and their props"));
ActorEntity currentEntity = em.find(ActorEntity.class, actor.getId(),hints);
if (currentEntity.getLastUpdate().getTime()!=actor.getLastUpdate())
{
throw new OptimisticLockException("Dto obsolete");
}
ActorEntity detachedActorEntity = mt.fromDto(actor);
em.merge(detachedActorEntity);
em.lock(currentEntity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
return ()->currentEntity.getLastUpdate().getTime();
}
我强制增加,因为属性在我的模型中没有 @Version。
我的 DAO 也是这样的:
@Transactional(value = TxType.REQUIRED)
public class ServiceDAO {
@PersistenceContext
protected EntityManager em;
}