2017-01-09 75 views
1

我有一個使用Hibernate的項目。如果修改,則在事務性方法結束時,持久性包中映射的所有對象(包含註釋)都會自動更新。JPA的批量更新觸發器TransactionalEventListener?

我想執行從JPA 2.1的CriteraUpdate的批量更新,但我需要更改從Spring觸發TransactionalEventListeners的對象。 如果我更改了對象,並且不調用任何保存方法,即使我使用JPA,hibernate仍會保留每個對象?

此外,我不知道TransactionalEventListener將使用JPA生命週期,而不是Hibernate的(我實現了ApplicationEventPublisherAware接口)。

+0

您可以附加事務方法以及偵聽器類嗎?你也使用哪個版本的Spring? –

回答

1

如果您使用JPA方法進行orm操作,我期望您使用的是EntityManager接口。

這是一個很好的方法,因爲您正在與API進行交互,而不是執行(作爲Hibernates Session類)。 EntityManager無論如何都在調用Session類,並且像裝飾器一樣起作用,因此Hibernate正在完成所有工作。

如果您的spring事務bean已正確配置爲使用Hibernate的SessionFactory,那麼偵聽器應捕獲事件。

我唯一能想到的是,當觸發批量操作時,JPA的PersistenceContext被忽略,而不是單個實體的dml操作和查詢。所有東西仍然纏繞在事務中,因此,應該調用偵聽器。

只是可以肯定,把這個標誌的@TransactionalEventListener作爲規範建議在沒有交易的情況下存在:

如果該事件是不是一個管理事務的邊界內公佈,事件除非明確設置了fallbackExecution()標誌,否則將被丟棄。