当前位置: 首页 > 知识库问答 >
问题:

Apache Karaf/OSGi中与Hibernate的事务

欧阳狐若
2023-03-14

我们正在开发一套模块(希望)部署在Apache Karaf中。每个模块都有一个分层结构,从域JPA实体/DAO、服务、Web组件等开始,其中每一层都变成了不同的OSGi包。

JPA实体扩展了一些属于公共包的抽象超类型。问题来了..

当学习卡拉夫和OSGi的方法时,OpenJPA被“宣传”了很多,所以我们首先尝试了一下。编译时增强是一场灾难,完全是浪费时间,因为我们的实体层次结构跨越了多个包(jar):几个pu和抽象超类型。即使它工作了,我担心OpenJPA增强需要我们用相同的Java和OpenJPA版本编译所有模块,这在将来可能会变得很难看,因为每个模块将以不同的速度开发。

然后,我们研究了Hibernate,并通过一些教程(看起来不是很流行)使它工作起来。然而,尽管所有持久化单元都是transaction type=“JTA”,但数据源通过JNDI是JTA类型的,并且DAO CRUD方法标记为Blueprint中的,例如,DAO save方法,它应该只包含以下内容

entityManager.persist(帐户)

仅在后跟

entityManager.flush();

我希望更改在事务结束时自动刷新(即在保存方法的末尾-当前事务结束边界)

如果我们在persist之后添加flush(),但随后抛出运行时异常,则整个save方法不会回滚。

日志中没有错误,并在调试级别检查它

创建了新的持久性上下文org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d对于事务[Xid:globalId=FFFFFF CA2D6DFFFFF…
由于自动加入检查而跳过JTA同步注册
正在清除EntityManagerorg.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d因为交易已经完成。

所以有一个事务,但它结束时没有将更改推送到数据库...

顺便说一下,冲水模式设置为自动。

谢谢你的任何建议。

共有2个答案

淳于知
2023-03-14

我建议使用Eclipse Link以更轻松地集成OSGI。

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

  • 实体管理器工厂设置:http://sourceforge.net/p/sand-irc/code/HEAD/tree/jerkbot/persistence/src/main/java/net/sf/jerkbot/entities/Activator.java
  • 线程本地所有者模式:http://sourceforge.net/p/sand-irc/code/HEAD/tree/jerkbot/core/src/main/java/net/sf/jerkbot/util/JPAUtil.java
  • DAO 用法: http://sourceforge.net/p/sand-irc/code/HEAD/tree/jerkbot/plugins/authentication/src/main/java/net/sf/jerkbot/plugins/authentication/dao/AdminDAO.java

希望有帮助

章晗日
2023-03-14

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

 类似资料:
  • 问题内容: 而不是将数据库操作分散在四个(osgi)包中,所有操作都在这里稍有不同。我想创建一个负责所有持久性问题的(简单)OSGi捆绑包。我觉得这并不像听起来那么简单,因为“每捆都有唯一的类加载器”。因此,如果有人知道这种问题的解决方案,我将非常感激。 问题答案: (如果您正在使用hibernate注释) 在通知Hibernate捆绑包有关注释类的信息后,保存所有Entities类加载器。 然后

  • 我试图使用Maven将Hibernate添加为我的OSGi包的依赖项。在我的POM文件中,我有: 但是,当我运行时,我得到了一个错误: 组织。奥斯基。框架BundleException:捆绑组织中未解决的约束。冬眠核心[8]:无法解决8.0:缺少要求[8.0]osgi。装电线。包裹( 所以我为javax添加了另一个依赖项。企业背景: 解决了之前的错误,但导致了另一个错误: 自动属性安装:file:

  • 我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

  • 在以下代码中: 无论我是否注释/取消注释事务,它们都工作正常,即没有事务也保存操作成功执行。但是当我检查留档时,他们总是在插入更新删除之前使用事务。有什么具体原因吗?我错过了什么吗? 请告诉我这件事。我相当困惑:( 当做

  • 并用@Transactional注释了具体类。 我们使用Jboss应用服务器支持通过JNDI与MQ集成。这里的问题是,如果监听器中的任何层有任何异常,则整个事务不会回滚,消息也不会移动到退出队列。很明显,当我们使用Hibernate事务管理器时,它不知道其他资源,如JMS事务。 我可以安全地用JTA事务替换它吗,因为Jboss将处理整个事务管理?这样做是否有任何可预见的风险?

  • Configuring the OSGi Framework To use Akka in an OSGi environment, the org.osgi.framework.bootdelegation property must be set to always delegate the sun.misc package to the boot classloader instead of