【问题标题】:Transactions with Hibernate in Apache Karaf / OSGi在 Apache Karaf / OSGi 中与 Hibernate 的事务
【发布时间】: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 支持它。

标签: hibernate osgi jta


【解决方案1】:

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

【讨论】:

  • 在 Hibernate 4.2.3 中发布,参见HHH-7527
【解决方案2】:

我建议使用 EclipseLink 来更轻松地集成 OSGI。

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 2015-04-19
    • 2016-12-18
    • 2012-07-24
    • 2015-05-22
    • 2014-03-11
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多