我们正在开发一套模块(希望)部署在Apache Karaf中。每个模块都有一个分层结构,从域JPA实体/ DAO,服务,Web组件等开始,其中每个层都变成一个不同的OSGi包。
JPA实体扩展了属于公共包的一些抽象超类型。这就是问题..
由于OpenJPA在学习Karaf和OSGi的方式时“广告”很多,所以我们先尝试了。由于我们的实体层次结构跨越多个捆绑包(jar),编译时增强是一种灾难并且完全浪费时间:几个PU和抽象超类型。即使它有效,我担心OpenJPA增强需要我们使用相同的Java和OpenJPA版本编译所有模块,这些模块将来可能会变得丑陋,每个模块将以不同的速率发展。
然后我们研究了Hibernate,感谢它的工作,感谢几个教程(看起来并不是很受欢迎)。但是,尽管所有持久性单元都是transaction-type =“JTA”,但数据源是通过JNDI的JTA类型,DAO CRUD方法标记为蓝图,DAO保存方法,例如,应该只保存类似< / p>
的EntityManager 。的持续(帐户)
仅在后跟
时有效的EntityManager 的冲洗();
我希望在事务结束时自动刷新更改(即在save方法结束时 - 当前事务结束边界)
如果我们在persist之后添加flush(),但是然后抛出一个运行时异常,则整个save方法都没有回滚。
日志中没有错误,并在调试级别显示
为事务创建了一个新的持久化上下文org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d [Xid:globalId = ffffffca2d6dfffff ...
...
由于自动加入检查而跳过JTA同步注册
...
在交易完成后清理EntityManager org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d。
所以有一个事务,但它结束时没有将更改推送到数据库..
顺便说一下,冲洗模式设置为AUTO。
感谢您提供的任何提示。
答案 0 :(得分:0)
由于Hibernate团队对Hibernate进行了一些改进,以便在OSGi上更顺畅地运行,您可能会考虑使用最新的Hibernate版本,不确定它是否已经发布。
答案 1 :(得分:0)
我建议使用EclipseLink来简化OSGI集成。
我曾经将JPA用于OSGI。我从OpenJPA开始,在遇到问题后切换到Hibernate,最后我使用EclipseLink来解决其他问题。
希望有所帮助