当前位置: 首页 > 面试题库 >

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

臧俊杰
2023-03-14
问题内容

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


问题答案:

从JPA 2.0开始不支持此功能。

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

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

因此,在JPA
2.1中,如果创建一个提供EntityManager的CDI生产者(只需用@Produces注释一个@PersistenceContext字段),则只需将EntityManager注入到侦听器中即可。

同时,我不知道有任何干净或令人愉快的解决方法。我能想到的“最糟”的事情是将EntityManager配置为绑定在JNDI中,然后通过JNDI查找从侦听器中获取它。



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

  • 在我的实际应用程序中,我有一个业务层,它根据一些业务规则使用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被回滚,但第二个(写日志)应该提交。这似乎可以使用正确的传播级别来写入日志条目: 然而,我的问题是,我在第二个事务中注

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