2017-01-26 2 views
1

Я использую 4.3.11 в своих проектах Liberty, но есть ошибка с Hibernate, решенная в версии 5. Я пробовал модернизировать, но я получаю разные исключения.Можно ли использовать Hibernate 5 в качестве механизма JPA в WAS Liberty Profile

Кто-нибудь использует Hibernate 5.x.x с профилем Liberty? Какие банки вы включаете в библиотеку dataSource в server.xml?

благодаря

+1

Так что, возможно, вам стоит рассмотреть возможность использования JPA, предоставленного в LIberty (Eclipse Link) ... – Gas

+0

Я уже пробовал, но слишком много лет кодируется с Hibernate под капотом. Пару лет назад я попытался, но EclipseLink показал слишком много предупреждений и проблем с запросами. К сожалению, даже пытаясь строго следовать JPA, слишком много «незначительных» различий, чтобы иметь возможность просто менять механизм JPA без изменений кода. Возможно, пришло время попробовать снова. – icordoba

ответ

3

Я был в состоянии получить Hibernate 5.x, по крайней мере, частично работает в Свободе, если я включаю эти баночки:

<library id="hibernate"> 
    <file name="${server.config.dir}/hibernate/antlr-2.7.7.jar"/> 
    <file name="${server.config.dir}/hibernate/classmate-1.3.0.jar"/> 
    <file name="${server.config.dir}/hibernate/dom4j-1.6.1.jar"/> 
    <file name="${server.config.dir}/hibernate/hibernate-commons-annotations-5.0.1.Final.jar"/> 
    <file name="${server.config.dir}/hibernate/hibernate-core-5.2.6.Final.jar"/> 
    <file name="${server.config.dir}/hibernate/javassist-3.20.0-GA.jar"/> 
    <file name="${server.config.dir}/hibernate/jboss-logging-3.3.0.Final.jar"/> 
    </library> 

    <application location="myApp.war"> 
    <classloader commonLibraryRef="hibernate"/> 
    </application> 

Поэтому я говорю, частично рабочим является то, что он прекрасно работает если используется источник не-jta-data-source, но при попытке использовать источник jta-данных Hibernate может не попробовать найти API-интерфейс, зависящий от поставщика, для приостановки текущей транзакции. Hibernate имеет некоторые свойства, которые вы можете сказать, что он используется серверами WebSphere, и я изучил различные комбинации тех, у кого нет успешного результата для jta-data-source. Я думаю, что в реализации Hibernate отсутствует осознание свободы, что действительно нужно добавить (см. HHH-10388 и проголосуйте за нее, если вы найдете ее ценной), хотя в ее отсутствие вы можете заставить ее работать, написав свой собственный реализация Hibernate JtaPlatform, которая делегирует com.ibm.tx.jta.TransactionManagerFactory и указывает его как свойство persistence.

К примеру, в persistence.xml,

<persistence-unit ... 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    ... 
    <properties> 
     <property name="hibernate.transaction.jta.platform" 
       value="example.WebSphereLibertyJtaPlatform" /> 
    </properties> 
    </persistence-unit> 

Пример реализация,

package example; 

import com.ibm.tx.jta.TransactionManagerFactory; 
import javax.naming.*; 
import javax.transaction.*; 
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; 

public class WebSphereLibertyJtaPlatform implements JtaPlatform { 
    public boolean canRegisterSynchronization() { 
     try { 
      return getCurrentStatus() == Status.STATUS_ACTIVE; 
     } catch (SystemException x) { 
      throw new RuntimeException(x); 
     } 
    } 

    public int getCurrentStatus() throws SystemException { 
     return retrieveTransactionManager().getStatus(); 
    } 

    public Object getTransactionIdentifier(Transaction transaction) { 
     return transaction; 
    } 

    public void registerSynchronization(Synchronization synchronization) { 
     try { 
      retrieveTransactionManager().getTransaction().registerSynchronization(synchronization); 
     } catch (IllegalStateException x) { 
      throw new RuntimeException(x); 
     } catch (RollbackException x) { 
      throw new RuntimeException(x); 
     } catch (SystemException x) { 
      throw new RuntimeException(x); 
     } 
    } 

    public TransactionManager retrieveTransactionManager() { 
     return TransactionManagerFactory.getTransactionManager(); 
    } 

    public UserTransaction retrieveUserTransaction() { 
     try { 
      return InitialContext.doLookup("java:comp/UserTransaction"); 
     } catch (NamingException x) { 
      throw new RuntimeException(x); 
     } 
    } 
} 
+0

Спасибо за ваш ответ. К сожалению, мне нужен источник данных JTA. (Кстати, я уже пользуюсь org.hibernate.jpa.HibernatePersistenceProvider ...Я думаю, что я всегда включал это в persistence.xml) ... слишком плохо. Надеюсь, это не заставило меня вернуться к JBoss ... – icordoba

1

Даже я закончил с подобной ситуацией. Сообщение об исключении: com.ibm.ws.container.service.state.StateChangeException: javax.xml.stream.FactoryConfigurationError: поставщик javax.xml.stream.XMLEventFactory не может быть создан: java.util.ServiceConfigurationError: javax.xml .stream.XMLEventFactory: поставщик com.ibm.xml.xlxp2.api.stax.XMLEventFactoryImpl не найден

вы видите какой-либо прорыв?

+0

Я закончил тем, что придерживался Hibernate 4 :-( – icordoba

1

Я знаю, что нить немного старая, но сравнивая Liberty Профиль 17.0.0.2 и 17.0.0.3 я заметил, что они ввели этот класс

com.ibm.ws.jpa.hibernate.LibertyJtaPlatform 

и теперь, когда я запустить сервер приложений, контейнер передают некоторые свойства, когда называет

HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) 

для инициализации спящего режима для источника данных и свойств у вас есть экземпляр этого класса:

enter image description here

Надеюсь, это поможет.

Смежные вопросы