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

如何在jpa侦听器中获取实体管理器或事务

潘宝
2023-03-14

我使用Hibernate事件监听器(如PostDeleteEventListener、PostInsertEventListener、PostUpdateEventListener)在插入、删除和更新过程中执行一些操作。现在我想使用JPA listener来完成这一工作,因为如果我想从Hibernate转移到任何其他JPA提供程序,我的listener应该可以工作。Hibernate listener给我event,我可以从中获取事务并检查它是提交的还是回滚的。JPA侦听器只为我提供实体对象。现在我如何在JPA侦听器中获得事务或会话或实体管理器??提前谢谢!!我正在使用Jboss作为我的CMT。

共有2个答案

伯洋
2023-03-14

在我的例子中,我使用的是以下代码:

ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();
auditLogService = (AuditLogService) ctx.getBean("auditLogService");

这对我很管用。

该应用程序的代码可在https://bitbucket.org/macielbombonato/apolo下载

我希望这能帮到你。

伯建安
2023-03-14

JPA2.0不支持这一点。

在JPA2.1(计划在Java EE7中)中,持久性提供程序将在托管环境(如JBoss应用服务器)中将实体侦听器视为CDI bean。在JPA 2.1规范的建议最终草案中,第96页:

当包含的归档是bean归档时,Java EE环境中的实体侦听器类支持通过上下文和依赖注入API(CDI)[10]进行依赖注入。使用CDI注入的实体侦听器类还可以定义使用PostConstruct和PreDestroy注释注释的生命周期回调方法。这些方法将分别在注入发生之后和实体侦听器实例被销毁之前被调用

因此,在JPA2.1中,如果您创建了一个提供EntityManager的CDI生成器(只需用@Produces注释@PersistenceContext字段),您就可以将EntityManager注入到侦听器中。

同时,我不知道有任何干净或愉快的变通办法。我能想到的“最不坏”的事情是将EntityManager配置为绑定在JNDI中,然后从侦听器内部通过JNDI查找获得它。

 类似资料:
  • 问题内容: 我使用的是Hibernate事件监听器,喜欢在插入,删除和更新期间执行一些操作。现在,我想使用JPA侦听器执行此操作,因为如果我想从Hibernate迁移到任何其他JPA提供程序,则我的侦听器应该可以工作。Hibernate侦听器为我提供了从中获取事务并检查其提交还是回滚的功能。JPA侦听器仅向我提供实体对象。现在如何在JPA侦听器中获取事务或会话或实体管理器?提前致谢!!我正在使用J

  • 在我的实际应用程序中,我有一个业务层,它根据一些业务规则使用JPA来持久化数据,问题是camel JPA事务没有与业务层事务共享。我需要业务类中的EntityManager与Camel事务范围集成,我该怎么做? 下面是一个简单的例子,但这反映了实际设计中的问题。 项目实例 服务级别 骆驼路线 骆驼背景。xml

  • 我有一个spring JMS侦听器,它正在侦听队列。一旦消息到达输入队列,它就会对消息进行某些处理,并将消息放入多个其他队列进行进一步处理(我们可以将这些其他队列称为输出队列)。在将消息发布到其他输出队列时,如果将消息发布到其中一个输出队列可能会由于任何原因而失败,我希望确保在失败之前完成的其他发布回滚到输出队列。基本上我想确保它是原子操作。在侦听器/容器上是否有任何注释/配置可用于在单个事务中实

  • 我有一个Spring Boot应用程序作为Spring JMS侦听器。我配置了多个数据源管理器一个用于Oracle,另一个用于DB2。 每当我启动应用程序时,jms侦听器容器都在寻找一个事务管理器bean,并在找到两个bean时给出以下错误。 我不想维护JMS事务。我如何实现它,或者我们如何禁用jms事务特性? 下面是我在我的主Spring Boot类上添加的注释。我也在使用Spring Data

  • 我正在使用Spring的事务支持和JPA(Hibernate)来持久化我的实体。一切正常,但我在处理一个请求中的部分更新时陷入困境: 对于每个用户(HTTP)请求,我必须将一个日志条目写入数据库表,即使“主”业务实体的更新失败(例如,由于验证错误)。因此,我的第一个/主要事务get被回滚,但第二个(写日志)应该提交。这似乎可以使用正确的传播级别来写入日志条目: 然而,我的问题是,我在第二个事务中注

  • 但问题是这将只锁定一行,而我想在计算总行数时锁定整个表(实体)。 请指教。