簡體   English   中英

如何從JPA EntityListener執行命名查詢?

[英]How do I execute named queries from a JPA EntityListener?

當該行更新時,我需要在數據庫中為每一行設置一個date_updated值。 我們將我正在使用的實體稱為Order ,該實體在數據庫中具有一個對應的orders表。

我已將date_updated列添加到orders表。 到現在為止還挺好。

我正在使用的@Entity Order對象由第三方提供。 我沒有能力修改源代碼以添加一個名為dateUpdated的字段。 無論如何,我都不需要將此值映射到對象-該值將僅用於商業智能目的,不需要在Java實體對象中表示。

我的問題是:每次修改Order對象(及其對應的數據庫表行)時,我都希望將數據庫中的date_updated列更新為當前時間。

約束:

  • 我們正在使用Oracle,Spring,JPA和Hibernate
  • 我無法使用Oracle觸發器來更新值。 我們正在使用一種數據庫復制技術,該技術阻止我們使用觸發器。

到目前為止,我的方法是使用xml中定義的JPA EntityListener,類似於:

<entity-mappings xmlns="....">
  <entity class="com.theirs.OrderImpl">
    <entity-listeners>
      <entity-listener class="com.mine.listener.OrderJPAListener" />
    </entity-listeners>
  </entity>
</entity-mappings>

我的偵聽器類如下所示:

public class OrderJPAListener { 

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

我遇到的問題是向偵聽器注入任何形式的持久性支持(或什至沒有任何東西)。 由於JPA通過其方法加載了偵聽器,因此我無權訪問偵聽器類中的任何Spring Bean。

如何將EntityManager (或任何Spring Bean)注入偵聽器類中,以便可以執行命名查詢來更新date_updated字段?

如何將EntityManager(或任何Spring Bean)注入偵聽器類中,以便可以執行命名查詢來更新date_updated字段?

如上所述,JPA 2.1支持通過CDI將托管bean注入到實體偵聽器。 我不確定Spring是否支持這一點。 后續帖子提出了針對Spring的解決方案。

https://guylabs.ch/2014/02/22/autowiring-pring-beans-in-hibernate-jpa-entity-listeners/

但是,一種可能的替代方法是在更新時覆蓋由Hibernate生成的SQL,這可能如下所述。

https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/querysql.html#querysql-cud

如果您有源,這將很簡單,因為您只需要在附加的date_update列上添加@SQLUpdate批注和標記即可。 但是,如您所願,您將需要查看如何通過xml配置文件為該實體重新定義元數據,並定義sql-update語句,如上所述:

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html/xml-overriding.html#xml-overriding-principles-entity

由於JPA 2.1實體偵聽器是CDI管理的。 您是否嘗試過使用@PersistenceUnit批注? 您正在使用JTA事務類型嗎?

否則,您可以在Listener類中使用Persistence.createEntityManagerFactory來檢索Persistence Context。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM