org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:329)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:730)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:127)
这个错误消息是有意义的。persistence.xml的配置没有指定事务类型。容器环境中默认的事务类型是JTA。当未将它被告知Weblogic Server的事务管理器的信息时,Hibernate会有所抱怨。配置Hibernate使之明确使用本地事务怎么样?我编辑了persistence.xml
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL"> 然后再次运行构建脚本,它将部署并运行JUnit测试,
$ ant -Dprovider=hibernate 让我惊喜的是,这次部署的应用程序没有出错。但是测试没有成功。
[echo] Running JUnit Test: junit.TestJPAService ...
[junit] Logical Persistence Provider is [hibernate]
[junit] Actual Persistence Provider is [org.hibernate.impl.SessionImpl]
[junit] Test junit.TestJPAService FAILED
[echo] *** ERROR: There are test failures. Output is shown below
[concat] Testsuite: junit.TestJPAService
[concat] Tests run: 2, Failures: 1, Errors: 0, Time elapsed: 2.934 sec
[concat]
[concat] ------------- Standard Output ---------------
[concat] Contacting server t3://localhost:7001 as weblogic for JPAService
[concat] ------------- ---------------- ---------------
[concat] ------------- Standard Error -----------------
[concat] Logical Persistence Provider is [hibernate]
[concat] Actual Persistence Provider is [org.hibernate.impl.SessionImpl]
[concat] ------------- ---------------- ---------------
[concat] Testcase: testLog(junit.TestJPAService): FAILED
[concat] Message is not assigned any identifier
[concat] junit.framework.AssertionFailedError: Message is not assigned any identifier
[concat] at junit.TestJPAService.testLog(Unknown Source)
通过了一个测试。用org.hibernate.impl.SessionImpl,确切地说,是它的代理对这个bean进行了注入。
但是,为什么向 Message实例分配标识符没有成功?
这只不过因为我们设计bean使用容器管理事务,而现在却配置为使用本地事务。所以我们的bean代码和容器都没有提交事务,而且因为标识值指定为由提供者赋值(见Message.java中的@Id注释)并且由Hibernate利用数据库列的自动增量特性为标识赋值――所以也没有提交表示没有标识值赋值。
当然,我们能够在JPAServiceBean.log()方法中添加明确的事务分界;但这不是解决方案。在容器环境中,我们倾向于使用容器管理的事务,倾向于配置持久性单元使用JTA。
如何告知Hibernate使用Weblogic事务管理器并将它的事务与容器事务结合起来?我通过Google进行了几分钟的搜索找到了答案。向persistence.xml添加以下属性。
文章来源于领测软件测试网 https://www.ltesting.net/