首页 > 解决方案 > javax.persistence.OptimisticLockException 没有被 Hibernate 包装

问题描述

我正在使用带有@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;
}

标签: javahibernatejpajava-ee-8

解决方案


推荐阅读