与Apache Karaf / OSGi中的Hibernate交易

时间:2013-05-28 20:01:59

标签: hibernate osgi jta

我们正在开发一套模块​​(希望)部署在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。

感谢您提供的任何提示。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

希望有所帮助