我在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);
}
}
}
发布于 2018-04-09 21:25:03
从Hibernate 5.2.13开始,为Liberty提供了正确的事务集成。如果您能够升级到此版本的Hibernate,那么它将被自动检测和应用,而不再需要指定hibernate.transaction.jta.platform
。
有关更多详细信息,请参阅Hibernate问题:https://hibernate.atlassian.net/browse/HHH-11571
发布于 2017-02-25 01:01:53
就连我也遇到了类似的情况。异常消息为: com.ibm.ws.container.service.state.StateChangeException: com.ibm.xml.xlxp2.api.stax.XMLEventFactoryImpl : Provider javax.xml.stream.FactoryConfigurationError:未能实例化Provider javax.xml.stream.XMLEventFactory: java.util.ServiceConfigurationError: javax.xml.stream.XMLEventFactory :Provider was found
你看到什么突破了吗?
https://stackoverflow.com/questions/41872159
复制相似问题