Spring 如何从JPA EntityListener执行命名查询?

Spring 如何从JPA EntityListener执行命名查询?,spring,oracle,hibernate,jpa,entitylisteners,Spring,Oracle,Hibernate,Jpa,Entitylisteners,我需要在数据库中为每行更新时设置一个date\u updated值。让我们调用我正在处理的实体Order,它在数据库中有一个对应的orders表 我已将date\u updated列添加到orders表中。到目前为止,一切顺利 我正在使用的@Entity Order对象是由第三方提供的。我无法修改源代码以添加名为dateUpdated的字段。无论如何,我不需要将这个值映射到对象——这个值只用于商业智能目的,不需要在Java实体对象中表示 我的问题是:每次修改Order对象(及其对应的数据库表行)

我需要在数据库中为每行更新时设置一个
date\u updated
值。让我们调用我正在处理的实体
Order
,它在数据库中有一个对应的
orders

我已将
date\u updated
列添加到
orders
表中。到目前为止,一切顺利

我正在使用的
@Entity Order
对象是由第三方提供的。我无法修改源代码以添加名为
dateUpdated
的字段。无论如何,我不需要将这个值映射到对象——这个值只用于商业智能目的,不需要在Java实体对象中表示

我的问题是:每次修改
Order
对象(及其对应的数据库表行)时,我都要将数据库中的
date\u updated
列更新为当前时间

限制条件:

  • 我们正在使用Oracle、Spring、JPA和Hibernate
  • 我无法使用Oracle触发器更新该值。我们使用的数据库复制技术阻止我们使用触发器
到目前为止,我的方法是使用JPA EntityListener,它是用xml定义的,类似于:

<entity-mappings xmlns="....">
  <entity class="com.theirs.OrderImpl">
    <entity-listeners>
      <entity-listener class="com.mine.listener.OrderJPAListener" />
    </entity-listeners>
  </entity>
</entity-mappings>
我遇到的问题是向我的侦听器中注入任何类型的持久性支持(或者任何东西)。因为JPA通过其方法加载侦听器,所以我无法访问侦听器类中的任何Springbean

如何将
EntityManager
(或任何Springbean)注入到我的listener类中,以便执行命名查询来更新
日期\u updated
字段

如何将EntityManager(或任何SpringBean)注入到 我的侦听器类,以便我可以执行命名查询来更新 更新日期字段

如上所述,JPA2.1支持通过CDI将托管bean注入实体侦听器。我不确定Spring是否支持这一点。下面的文章提出了一个特定于Spring的解决方案

但是,一种可能的替代方法是在更新时覆盖Hibernate生成的SQL,如下所述

如果您有源代码,这将非常简单,因为您只需要在附加的date\u update列上添加@SQLUpdate注释和标记。但是,由于您不知道,您需要通过xml配置文件重新定义该实体的元数据,并定义sql update语句,如上所述:


因为JPA2.1实体侦听器是CDI管理的。您是否尝试过使用
@PersistenceUnit
注释?您使用的是JTA事务类型吗


否则,您可以在Listener类中使用
Persistence.createEntityManagerFactory
来检索持久性上下文。

最后,我使用了类似于guylabs.ch的解决方案,使用Spring的自动连接现有实例的功能。事实证明,Spring足够聪明,可以自动关联带有@PersistenceUnit注释的字段。
public class OrderJPAListener { 

  @PostPersist
  @PostUpdate
  public void recordDateUpdated(Order order) {
    // do the update here
  }
}