Java Bitronix+;弹簧&x2B;冬眠+;坚持不懈
我正在尝试创建事务管理器,并将其与Hibernate for Oracle一起使用 我的persistence.xml文件是:Java Bitronix+;弹簧&x2B;冬眠+;坚持不懈,java,hibernate,spring,persistence,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-
<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>
我得到一个例外:
Caused by: org.hibernate.HibernateException: Could not find datasource: jdbc/testDS1
异常出现在ds=(数据源)NamingHelper.getInitialContext(props.lookup(jndiName)上
有什么问题吗
Hibernate持久性如何知道引用springtxManager
bean
你是将其部署为战争还是EAR?您是否在web.xml中声明了数据源并在app server上进行了设置
更新:由于您在WAR中声明了数据源,请确保您在Tomcat中拥有JNDI数据源
您的错误是:“由以下原因引起:org.hibernate.HibernateException:找不到数据源:jdbc/testDS1”。这是一个JNDI查找名称
那么,“我不想”这个词在哪里呢
Spring需要一个Java命名和目录服务来查找与此名称关联的数据源;这就是Tomcat提供的。如果不是Tomcat,你建议春天从哪里来?命名服务是JavaEE应用服务器的一部分
您要么在Tomcat上设置JNDI数据源和连接池,要么放弃它提供的好处,告诉Spring改用DriverManager数据源:
调用Persistence.createEntityManagerFactory()时,您的数据源似乎尚未创建。由于BitronixtTransactionManager bean依赖于数据源bean,因此您应该看到一些信息日志,告诉您BTM已经启动,这意味着数据源也已经创建
另一个潜在原因可能是Hibernate没有在正确的JNDI上下文中查找数据源。您可以启用bitronix.tm.jndi调试日志,以断言正在调用其jndi提供程序
有什么问题吗
通过询问jdbc/testDS1
,您是否能够在独立的java应用程序中使用此数据源?在常规Tomcat数据源中,您需要请求java:comp/env/jdbc/testDS1
,而不仅仅是jdbc/testDS1
Hibernate持久性如何知道如何引用SpringTXManager bean
没有。您这样说是为了休眠:
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.BTMTransactionManagerLookup" />
因此,Hibernate将使用lookup类来“查找”事务管理器:-)我相信我已经运行了类似的场景。My persistence.xml如下所示:
<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<!-- other configuration ommited -->
<jta-data-source>java:comp/env/jdbc/YourPersistentUnitJNDI_Name</jta-data-source>
<!-- other configuration ommited -->
</persistence-unit>
java:comp/env/jdbc/YourPersistentUnitJNDI_名称
spring应用程序bean xml文件如下所示:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
希望有帮助 持久性提供程序在jndi上进行查找。Spring应用程序上下文中定义的数据源未绑定到jndi。因此,持久性提供程序对数据源的查找尝试失败,因为没有绑定到jndi的此类数据源
您可能需要检查一下
您能否尝试在服务器上下文中定义数据源,并通过jndi名称在spring应用程序中查找它们?我认为要么persistence.xml配置不正确,要么您没有启动spring容器。
这里我发布了我的persistence.xml代码
enter code here
<persistence-unit name="org.drools.task" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/mysql</jta-data-source>
<class>org.drools.task.Attachment</class>
<properties>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.current_session_context_class" value="jta" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
<property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.show_sql" value="true" />
<!-- after first run the application, should comment it, else it will drop and create table each time
<property name="hibernate.hbm2ddl.auto" value="create" /> -->
</properties>
</persistence-unit>
事务管理器配置与您发布的相同。
它可以工作。如果我使用Spring,为什么我需要用tomcat设置JNDI数据?事实上,这对我很有用。不起作用的是:DataSource ds=(DataSource)ic.lookup(“java:comp/UserTransaction”);当我用tomcat配置它时,它曾经工作过。另外,在您的回答中,我没有使用spring directlyso,您实际上是在说我必须一起配置tomcat和spring,以便获得“java:comp/UserTransaction”jndi?我担心spring文档会对典型的JTA事务(必需、支持、强制、从不)说一些其他的话,一个简单的JtaTransactionManager定义就是您所需要的,可以在所有J2EE服务器上完全移植。这与JTA UserTransaction的功能相对应,J2EE为其指定了一个标准JNDI名称(“java:comp/UserTransaction”)。对于这种79*类型的JTA使用,无需配置特定于服务器的TransactionManager查找。阅读更多:我看到它是在日志消息中创建的:2011-03-15 23:01:36672 DEBUG(poolgdatasource.java:84)-为jdbc/testDS1构建XA池,连接为0,但我仍然得到了异常!再次说明:另一个潜在原因可能是Hibernate没有在正确的JNDI上下文中查找数据源。您可以启用bitronix.tm.jndi调试日志来断言其jndi提供程序正在被调用。您好!我刚刚意识到我的问题是需要在上下文中找到java:comp/UserTransaction。问题不在于ds1。当我用tomcat创建它时,它自动将选项卡绑定到java:comp/UserTransaction。我怎样才能用春天来做呢?
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
enter code here
<persistence-unit name="org.drools.task" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/mysql</jta-data-source>
<class>org.drools.task.Attachment</class>
<properties>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.current_session_context_class" value="jta" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
<property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.show_sql" value="true" />
<!-- after first run the application, should comment it, else it will drop and create table each time
<property name="hibernate.hbm2ddl.auto" value="create" /> -->
</properties>
</persistence-unit>
enter code here
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
JtaTransactionManager txManager = (JtaTransactionManager) ctx.getBean("txManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
System.out.println("The transaction manager is "+txManager);
System.out.println("The transaction is "+status);