Я пишу обычное приложение 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;
}