0

我们正在开发一套模块​​(希望)部署在 Apache Karaf 中。每个模块都有一个分层结构,从域 JPA 实体/DAO、服务、Web 组件等开始,其中每一层都变成不同的 OSGi 包。

JPA 实体扩展了一些属于公共包的抽象超类型。问题来了..

由于 OpenJPA 在学习 Karaf 和 OSGi 的方式时经常被“宣传”,所以我们首先尝试了它。由于我们的实体层次结构跨越多个包(jar):几个 PU 和抽象超类型,因此编译时增强是一场灾难和完全浪费时间。即使它起作用了,恐怕 OpenJPA 增强功能需要我们用相同的 Java 和 OpenJPA 版本编译所有模块,这在将来每个模块将以不同的速度开发时可能会变得丑陋。

然后我们研究了 Hibernate 并通过几个教程让它工作(看起来不是很受欢迎)。然而,虽然所有的持久化单元都是 transaction-type="JTA",但数据源是通过 JNDI 的 JTA 类型,并且 DAO CRUD 方法在蓝图中被标记,例如,DAO 保存方法应该只包含类似

实体管理器坚持(帐户)

仅在跟随时有效

实体管理器冲洗();

我期望在事务结束时自动刷新更改(即在保存方法结束时 - 当前事务结束边界)

如果我们在persist 之后添加flush(),但随后抛出运行时异常,则整个save 方法不会回滚。

日志中没有错误并在调试级别检查它显示

为事务 [Xid:globalId=ffffffca2d6dfffff ...
...
由于自动加入检查而跳过 JTA 同步注册
...
清除 EntityManager org .apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d 事务已完成。

所以有一个事务,但它在没有将更改推送到数据库的情况下结束..

顺便说一下,冲洗模式设置为自动。

感谢您提供的任何提示。

4

2 回答 2

0

我建议使用 EclipseLink 来简化 OSGI 集成。

我曾经将 JPA 与 OSGI 一起使用。我从 OpenJPA 开始,遇到问题后切换到 Hibernate,最后我使用 EclipseLink 来解决其他问题。

希望能帮助到你

于 2013-06-01T08:28:14.877 回答
0

由于 Hibernate 团队为 Hibernate 在 OSGi 上更流畅地运行做了一些改进,您可能会考虑使用最新的 Hibernate 版本,不确定它是否已经发布。

于 2013-05-29T06:51:57.933 回答