我们正在开发一套模块(希望)部署在 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 事务已完成。
所以有一个事务,但它在没有将更改推送到数据库的情况下结束..
顺便说一下,冲洗模式设置为自动。
感谢您提供的任何提示。