为什么回滚不适用于 hibernate/osgi/karaf/JPA/mysql

Why does rollback not work with hibernate/osgi/karaf/JPA/mysql

我正在使用 karaf 3.0.3 以及以下 Hibernate 包:

161 |活跃| 80 | 4.2.12.Final |休眠核心
162 |活跃| 80 | 4.2.12.Final |休眠实体管理器
172 |活跃| 80 | 4.2.12.Final |休眠 osgi

虽然我可以将完全相同的组件(JPA DAO、服务层等)部署为独立的 Spring 应用程序,但使用此设置我无法使事务回滚工作,我明白了回滚正确执行。

尝试使交易成功地与 OSGI/hibernate 一起工作时有哪些陷阱?

如果我在这里没有得到回复,我会更新更具体的信息,但首先我想看看这是否是 OSGi/hibernate/jpa 的常见问题。

在 user2007829 的评论后编辑: DAO 扩展 Spring 的 JpaRepository,服务层方法用 Spring 的 @Transactional 注释。我相信这个设置,自动提交应该隐式关闭,独立 spring 应用程序设置按预期工作。那是错的吗?

持久化单元 XML 文件在 OSGI 案例中应该有何不同?现在唯一的区别是 karaf 案例中的事务类型是 JTA,我有这样的声明:

<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/‌​my-datasource)</jta-data-source>

你是怎么使用hibernate的?您是否创建交易并在其中工作,或者您的查询会话是否相关?另外,您是否将 autocommit 设置为 false?

发生这种情况的可能原因有很多。例如,您的数据源可能未正确包装 XADataSource。在这种情况下,可能会出现 EntityManager 未加入事务或未作为 XA 资源登记的情况。

看看这些教程。从工作基础开始更容易: http://www.liquid-reality.de/x/LYBk http://www.liquid-reality.de/x/C4DK

不幸的是,这些教程是基于 blueprint 和 aries jpa,所以它并不完全 spring。您仍然应该能够使用其中的一些信息。 此外,我只能建议从 spring 切换到蓝图,因为 spring 不再支持 OSGi。

对于蓝图,有教程基于的 apache aries 或 eclipse gemini。