![](/img/trans.png)
[英]How can I configure a JPA EntityListener via a Spring XML configuration file?
[英]How do I execute named queries from a JPA EntityListener?
當該行更新時,我需要在數據庫中為每一行設置一個date_updated
值。 我們將我正在使用的實體稱為Order
,該實體在數據庫中具有一個對應的orders
表。
我已將date_updated
列添加到orders
表。 到現在為止還挺好。
我正在使用的@Entity Order
對象由第三方提供。 我沒有能力修改源代碼以添加一個名為dateUpdated
的字段。 無論如何,我都不需要將此值映射到對象-該值將僅用於商業智能目的,不需要在Java實體對象中表示。
我的問題是:每次修改Order
對象(及其對應的數據庫表行)時,我都希望將數據庫中的date_updated
列更新為當前時間。
約束:
到目前為止,我的方法是使用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語句,如上所述:
由於JPA 2.1實體偵聽器是CDI管理的。 您是否嘗試過使用@PersistenceUnit
批注? 您正在使用JTA事務類型嗎?
否則,您可以在Listener類中使用Persistence.createEntityManagerFactory
來檢索Persistence Context。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.