Я был в состоянии получить 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);
}
}
}
Так что, возможно, вам стоит рассмотреть возможность использования JPA, предоставленного в LIberty (Eclipse Link) ... – Gas
Я уже пробовал, но слишком много лет кодируется с Hibernate под капотом. Пару лет назад я попытался, но EclipseLink показал слишком много предупреждений и проблем с запросами. К сожалению, даже пытаясь строго следовать JPA, слишком много «незначительных» различий, чтобы иметь возможность просто менять механизм JPA без изменений кода. Возможно, пришло время попробовать снова. – icordoba