是否有可能使用Hibernate 5在JPA引擎自由简介(Is it possible to use

2019-09-27 03:08发布

我用4.3.11我的自由的项目,但有我试图在升级版本5解决了Hibernate的一个错误,但我得到不同的异常。

任何人是使用Hibernate的5.xx与自由个人资料? 什么罐子你包括在server.xml中的数据源库?

谢谢

Answer 1:

我已经能够得到休眠5.x中至少部分地在自由工作,如果我有这些JAR:

  <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的数据源,但试图使用JTA数据源时的伟大工程,Hibernate可以失败,试图找到供应商特定的API暂停当前事务。 休眠确实有一些属性,你可以设置来告诉它,它的正在使用WebSphere服务器,和我探讨了那些的各种组合而不考虑JTA数据源成功的结果。 我认为Hibernate实现是缺乏其自由的意识,这恐怕是真的应该被添加,(见HHH-10388并投票支持它,如果你会发现有价值的),尽管其没有,你可以得到它的写作工作自己的实现休眠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);
        }
    }
}


Answer 2:

即使我结束了类似的情况。 异常信息是: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未找到

你看到过任何破发?



Answer 3:

我知道这个线程是有点老了,但比较自由简介17.0.0.2和17.0.0.3我注意到他们已经推出了此类

com.ibm.ws.jpa.hibernate.LibertyJtaPlatform

而现在,当我启动应用程序服务器,容器经过时某些属性调用

HibernatePersistenceProvider.createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties)

初始化休眠的数据源和你有类的实例的属性:

希望能帮助到你。



Answer 4:

由于休眠5.2.13的,正确的交易整合已交付自由。 如果你能够升级到这个版本的Hibernate,那么它将被检测到,并自动应用,不必指定hibernate.transaction.jta.platform了。

看到这个Hibernate的问题更多详情: https://hibernate.atlassian.net/browse/HHH-11571



文章来源: Is it possible to use Hibernate 5 as JPA engine in WAS Liberty Profile