【发布时间】:2013-05-23 22:06:04
【问题描述】:
我们正在开发一套模块,以(希望)部署在 Apache Karaf 中。每个模块都有一个分层结构,从域 JPA 实体/DAO、服务、Web 组件等开始,其中每一层都变成不同的 OSGi 包。
JPA 实体扩展了一些属于公共包的抽象超类型。问题来了..
由于 OpenJPA 在学习 Karaf 和 OSGi 的方式时经常被“宣传”,所以我们首先尝试了它。由于我们的实体层次结构跨越多个包(jar):几个 PU 和抽象超类型,因此编译时增强是一场灾难和完全浪费时间。即使它有效,恐怕 OpenJPA 增强功能要求我们使用相同的 Java 和 OpenJPA 版本编译所有模块,这可能会在将来每个模块以不同的速度开发时变得丑陋。
然后我们研究了 Hibernate 并通过几个教程让它工作(看起来不是很受欢迎)。然而,虽然所有的持久化单元都是 transaction-type="JTA",但数据源是通过 JNDI 的 JTA 类型,并且 DAO CRUD 方法被标记为蓝图中,例如 DAO 保存方法,它应该只包含类似
entityManager.persist(帐户)
仅在跟随时有效
entityManager.flush();
我希望在事务结束时自动刷新更改(即在保存方法结束时 - 当前事务结束边界)
如果我们在persist之后添加flush(),然后抛出运行时异常,则整个save方法不会回滚。
日志中没有错误,并在调试级别检查它显示
为事务 [Xid:globalId=ffffffca2d6dfffff...
创建了一个新的持久化上下文 org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d
...
由于自动加入检查而跳过 JTA 同步注册
...
在事务完成后清理 EntityManager org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d。
所以有一个事务,但它在没有将更改推送到数据库的情况下结束..
顺便说一下,冲洗模式设置为自动。
感谢您提供的任何提示。
【问题讨论】:
-
您能在某处发布您的代码或简化版本吗?仅凭这些信息有点难以猜测。 Hibernate 目前对 OSGi 不是很友好。所以你也可以试试 Eclipselink。现在 aries 支持它。