我在 Liberty 项目中使用 4.3.11,但版本 5 中解决了 Hibernate 的一个错误。我尝试升级,但遇到了不同的异常。
有人使用带有 Liberty Profile 的 Hibernate 5.x.x 吗?您在 server.xml 的 dataSource 库中包含哪些 jar?
thanks
如果我包含这些 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 服务器使用,并且我已经探索了这些属性的各种组合,但没有为 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);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)