我在Liberty项目中使用4.3.11,但Hibernate在版本5中解决了一个错误。我尝试过升级,但得到了不同的异常。
有人在使用带有Liberty配置文件的Hibernate 5.x.x吗?您在server.xml的dataSource库中包含了哪些jars?
谢谢
发布于 2017-01-26 22:31:11
如果我包括这些JAR,我已经能够让Hibernate 5.x至少部分地在Liberty中工作:
<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-data-source时,Hibernate可能无法找到特定于供应商的API来挂起当前事务。Hibernate确实有一些属性,您可以设置这些属性来告诉它WebSphere服务器正在使用Hibernate,我已经研究了这些属性的各种组合,但对于jta-data-source没有成功的结果。我认为Hibernate实现缺乏对自由的认识,这是真正应该添加的东西(请参阅HHH-10388,如果您认为它有价值,请投票给它),尽管在它不存在的情况下,您可以通过编写自己的Hibernate JtaPlatform实现来委托com.ibm.tx.jta.TransactionManagerFactory并将其指定为持久性属性,从而使其工作。
例如在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);
}
}
}
https://stackoverflow.com/questions/41872159
复制相似问题