Bitronix + Spring + Hibernate + Persistence

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

我的persistence.xml文件是:

 org.hibernate.ejb.HibernatePersistence jdbc/testDS1 org.drools.persistence.session.SessionInfo org.jbpm.persistence.processinstance.ProcessInstanceInfo org.drools.persistence.processinstance.WorkItemInfo true          

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

        myURL username password         

但是,当我跑:

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

我得到一个例外:

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

ds = (DataSource ) NamingHelper.getInitialContext(props).lookup(jndiName); Hibernate infra文件。

  1. 可能是什么问题呢?

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

您的持久性提供程序在jndi上执行查找。 Spring应用程序上下文中定义的数据源不绑定到jndi。 因此,持久性提供程序对数据源的查找尝试失败,因为没有绑定到jndi的此类数据源。

您可以查看http://forum.springsource.org/showthread.php?t=13984 。

您是否可以尝试在服务器上下文中定义数据源,并通过其jndi名称在Spring应用程序中查找它们?

看起来在调用Persistence.createEntityManagerFactory()时尚未创建数据源。 由于您的bitronixTransactionManager bean依赖于dataSource,您应该看到一些INFO日志告诉您BTM已经启动,这应该意味着数据源也已创建。

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

可能是什么问题呢?

您是否可以通过询问jdbc/testDS1在独立的Java应用程序中使用此数据源? 在常规的Tomcat DataSources中,您需要请求java:comp/env/jdbc/testDS1 ,而不仅仅是jdbc/testDS1

Hibernate持久化如何知道引用spring txManager bean?

它没有。 你是这么说的Hibernate:

   

所以,Hibernate将使用查找类来“查找”事务管理器:-)

您是将其部署为WAR还是EAR? 您是否在web.xml中声明了数据源并在应用服务器上进行了设置?

更新:由于您已在WAR中声明了数据源,因此请确保已在Tomcat中设置 JNDI数据源。

您的错误说:“由以下原因引起:org.hibernate.HibernateException:找不到数据源:jdbc / testDS1”。 这是一个JNDI查找名称。

那么“我不想”适合这个?

Spring需要Java命名和目录服务来查找与此名称关联的数据源; 这就是Tomcat提供的function。 如果不是Tomcat,你建议Spring从哪里得到它? 命名服务是Java EE应用服务器的一部分。

您必须在Tomcat上设置JNDI数据源和连接池,或者放弃它提供的好处,并告诉Spring使用DriverManagerDataSource:

http://static.springsource.org/spring/docs/2.5.x/reference/jdbc.html

我相信我有类似的情况在运行。 我的persistence.xml如下所示:

   java:comp/env/jdbc/YourPersistentUnitJNDI_Name   

Spring应用程序bean xml文件如下:

          

希望有所帮助!

我认为要么persistence.xml没有正确配置,要么你还没有启动SPring容器。 在这里我发布了我的persistence.xml代码

 enter code here  org.hibernate.ejb.HibernatePersistence jdbc/mysql org.drools.task.Attachment            

和我的测试代码:

 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); 

事务管理器配置与您发布的相同。 它可以工作。