2016-08-09 13 views
0

Я пытаюсь перенести приложение, которое использует несинхронизированный контекст персистентности с транзакцией 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 при запуске менеджера объектов? Я что-то упускаю?

ответ

0

Поскольку тип синхронизации распространяется на введенный enntiyManager, я понял, что я могу использовать EntityManagerFactory для создания entityManger. На заводе есть метод, принимающий тип синхронизации, поэтому он создаст несинхронизированный контекст.

@PersistenceUnit 
private EntityManagerFactory emf; 
... 
emf.createEntityManager(SynchronizationType.UNSYNCHRONIZED); 

Кроме того, я обнаружил, что этот вопрос вошли против WildFly 8,1 https://issues.jboss.org/browse/WFLY-5006