• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

插入式持久性提供者的承诺:Kodo、OpenJPA和Hibernate

发布: 2008-6-25 14:30 | 作者: 不详 | 来源: 测试时代编辑整理 | 查看: 527次 | 进入软件测试论坛讨论

领测软件测试网


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/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网