java - Bitronix + Spring + Hibernate + 持久性

标签 java hibernate spring persistence

我正在尝试创建事务管理器并将其与 Hibernate for Oracle 一起使用。

我的 persistence.xml 文件是:

<persistence-unit name="org.drools.persistence.jpa"
        transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/testDS1</jta-data-source>
        <class>org.drools.persistence.session.SessionInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <class>org.drools.persistence.processinstance.WorkItemInfo</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.connection.autocommit" value="false" />
            <property name="hibernate.max_fetch_depth" value="3" />
            <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/> 
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.BTMTransactionManagerLookup" />
        </properties>
    </persistence-unit>

在spring的applicationContext.xml中我添加了:

<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close"> 
           <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource" /> 
           <property name="uniqueName" value="jdbc/testDS1" /> 
           <property name="minPoolSize" value="1" /> 
           <property name="maxPoolSize" value="5" /> 
           <property name="driverProperties">
            <props>
                <prop key="URL">myURL</prop>
                <prop key="user">username</prop>
                <prop key="password">password</prop>
            </props>
        </property>       
    </bean> 

    <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
        <property name="transactionManager" ref="bitronixTransactionManager"/> 
        <property name="userTransaction" ref="bitronixTransactionManager"/> 
    </bean> 

    <bean id="bitronixTransactionManager" factory-method="getTransactionManager" 
          class="bitronix.tm.TransactionManagerServices" depends-on="dataSource,txManager" 
          destroy-method="shutdown"/>

但是,当我运行时:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");

我遇到异常:

Caused by: org.hibernate.HibernateException: Could not find datasource: jdbc/testDS1

异常(exception)是 Hibernate 基础设施文件的 ds = (DataSource ) NamingHelper.getInitialContext(props).lookup(jndiName);

  1. 可能是什么问题?

  2. Hibernate 持久性如何知道引用 spring txManager bean?

最佳答案

调用 Persistence.createEntityManagerFactory() 时,您的数据源似乎尚未创建。由于您的 bitronixTransactionManager bean 依赖于 dataSource bean,因此您应该会看到一些信息日志,告诉您 BTM 已启动,这意味着数据源也已创建。

另一个潜在的原因可能是 Hibernate 没有在正确的 JNDI 上下文中查找数据源。您可以启用 bitronix.tm.jndi DEBUG 日志来断言其 JNDI 提供程序正在被调用。

关于java - Bitronix + Spring + Hibernate + 持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5027539/

相关文章:

java - 在 Spring-Hibernate 项目中初始化实体集合 (POJO) 的正确方法是什么?

java - Spring bean接口(interface)声明

Java从父类获取子方法

Java Swing + Hibernate + Maven

java - 如何在mysql中选择表的列名,列数据类型,关键列

java - Jenkins 钩子(Hook)不工作 - Jenkins bitbucket

java - 用于生成和使用 JSON 的 Controller 的 Spring RequestMapping

spring - 关于 Spring 的单例 bean

java - 获取 Runnable 的当前实例

java - Android (Kotlin) 与非字符串基元类型的双向数据绑定(bind)