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文件。
-
可能是什么问题呢?
-
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);
事务管理器配置与您发布的相同。 它可以工作。