0

@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 でテスト済み: hibernate 5.0.10 および 5.3.6

私がやっていることは、子テーブル ActorProperties で Actor を更新することです。Actor は @Version with 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;
}
4

0 に答える 0