javax.persistence.OptimisticLockException, не обернутый Hibernate - PullRequest
0 голосов
/ 04 марта 2019

Я пишу обычное приложение JEE8 с JPA с @Version (OptimisticLock).Мой DAO - это компонент CDI, помеченный @Transactional (value = TxType.REQUIRED)

, когда обновление конфликтует: 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.Актер тот, у кого @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;
}
...