Я пытаюсь перенести приложение, которое использует несинхронизированный контекст персистентности с транзакцией JTA, от hibernate 4.3.7 до Hibernate 5.0.7, и я нашел пару проблем, не может опустить голову. Вводите наш объект как:Использование USYNCHRONIZED контекста постоянства с Hibernate 5.x и Wildlfy
@PersistenceContext(type = PersistenceContextType.EXTENDED, synchronization = SynchronizationType.UNSYNCHRONIZED)
private EntityManager entityManager;
Поэтому я ожидаю наличия расширенного и несинхронизированного контекста постоянства. Приложение использует функцию UNSYNCHRONIZED, чтобы избежать сброса изменений сущностей в базу данных, пока мы этого не сделаем. Обычно мы хотим сбросить изменения только после операций сохранения/сохранения/удаления, и эти методы вызывали entityManager.joinTransaction();
, чтобы явно отметить текущую транзакцию для синхронизации. Это используется для определенной работы в Hibernate 4.3.7, но остановлено в версии 5.
Для версии 5 ребята из Hiberante довольно много переписывали, особенно в области обработки транзакций. По моему мнению, hibernate использует флаг session.autoJoinTransactions для реализации функции UNSYNCHRONIZED. Сессия не будет очищена (мы используем default flushMode.AUTO), если сеанс не присоединился к транзакции. Ранее этот флаг будет установлен на новую сессию,
sessionBuilder.autoJoinTransactions(getTransactionType() != PersistenceUnitTransactionType.JTA);
и в спящем режиме 5 (EntityManagetImpl линией 132)
sessionBuilder.autoJoinTransactions(getSynchronizationType() == SynchronizationType.SYNCHRONIZED);
Как мы используем JTA транзакцию, управляемой она используется для работы. Но теперь это не так. Кажется, что решение для autoJoinTransaction
флага на основе SynchronizationType - это правильная вещь, но есть одна небольшая проблема. PersistenceContextTyoe не распространяется на методы EntityFactoryImpl, и поэтому менеджер объектов всегда создается как синхронизированный. При вводе entityManager вызов wildlfy вызывает первый, а не второй.
@Override
public EntityManager createEntityManager(Map map) {
return internalCreateEntityManager(SynchronizationType.SYNCHRONIZED, map);
}
@Override
public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
errorIfResourceLocalDueToExplicitSynchronizationType();
return internalCreateEntityManager(synchronizationType, map);
}
Так что мои вопросы: Как придать экземпляр менеджера объекта с UNSYNCHRONIZED контекстом настойчивости? Почему Wildfly
игнорирует параметр type = PersistenceContextType.EXTENDED
при запуске менеджера объектов? Я что-то упускаю?