我在使用Hibernate事件監聽器如PostDeleteEventListener, PostInsertEventListener, PostUpdateEventListener
在插入,刪除和更新過程中執行一些操作。現在我想使用JPA偵聽器來做到這一點,因爲如果我想從Hibernate移動到任何其他JPA提供程序,我的偵聽器應該工作。 Hibernate監聽器給我從中我可以得到事務並檢查它是否提交或回滾。 JPA偵聽器僅向我提供實體對象。現在我怎樣才能獲得JPA偵聽器中的事務或會話或實體管理器?提前致謝!!我使用Jboss作爲我的CMT。如何獲得jpa監聽器中的實體管理器或事務
回答
這是不支持的JPA 2.0。 (在JBoss應用服務器中),持久化提供者將實體監聽器當作CDI bean來對待,在託管環境中(比如JBoss應用服務器),持久化提供者將把JPA 2.1當作CDI bean。從Proposed Final Draft of the JPA 2.1 spec,96頁:在Java EE中
實體監聽器類環境的支持依賴 注入通過上下文和依賴注入API(CDI)[10] 當含歸檔文件是豆歸檔文件。使用CDI注入的實體監聽器類也可以定義生命週期 使用PostConstruct和PreDestroy註釋標註的回調方法。這些方法將注射後調用已 地點和實體監聽器實例之前被銷燬 分別
所以在JPA 2.1,如果你創建一個CDI生產者提供的EntityManager(簡單地通過註釋一個@PersistenceContext場@Produces),你可以@將EntityManager注入到監聽器中。
與此同時,我不知道任何干淨或愉快的解決方法。我能想到的「最不好」的事情是將EntityManager配置爲綁定在JNDI中,然後通過來自監聽器內的JNDI查找來獲取它。
您可以使用所有前/後載荷,插入,更新或者使用兩種方式在JPA刪除監聽器:
通過使用註解。 使用監聽器可能是一個實體具有需要的實體已被持久化,更新或加載,如後要填充的瞬時變量的一個簡單的例子:
public class AvailableCreditListener { @PostLoad @PostPersist @PostUpdate public void calculateAvailableCredit(Account account) { account.setAvailableCredit( account.getBalance().add( account.getOverdraftLimit())); } }
實體類將與@來註釋EntityListeners:
@EntityListeners({AvailableCreditListener.class}) public class Account extends BaseEntity { private BigDecimal balance; private BigDecimal overdraftLimit; @Transient private BigDecimal availableCredit; // getters and setters }
通過使用persistence.xml配置文件。
最後,可以使用XMl映射文件而不是註釋來與應用程序一起部署默認監聽器。 (此映射文件由persistence.xml文件引用。)但是,如果實體不想使用默認偵聽器,則可以使用@ExcludeDefaultListeners註釋。
@ExcludeDefaultListeners
@Entity
public class Account extends BaseEntity {
....
}
在你的persistence.xml:
<persistence-unit-metadata>
<persistence-unit-defaults>
<entity-listeners>
<entity-listener class="samples.AvailableCreditListener"/>
</entity-listeners>
</persistence-unit-defaults>
</persistence-unit-metadata>
對我來說,我使用此代碼:
ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();
auditLogService = (AuditLogService) ctx.getBean("auditLogService");
這非常適用於我。
這個應用程序的代碼可以在https://bitbucket.org/macielbombonato/apolo
我希望這可以幫助你下載。
中的entityManager這應該被注意爲「答案」,但明確的答案(對於一般情況),將獲得entityManager通過JNDI查找,但特定的綁定使用將是容器特定的(JBoss,Glassfish,Weblogic等) – him
- 1. 驗證Jpa實體:服務中或生命週期監聽器
- 2. 春天JPA - 注射事務管理器VS注入實體管理器
- 3. Spring JMS監聽器中的事務管理
- 4. 如何禁用JPA 2回調方法和實體監聽器
- 5. 在多處理器上添加事件監聽器。管理器
- 6. JPA實體管理器資源處理
- 7. 如何從控制器內部獲得Symfony 2.1的實體管理器實體管理器
- 8. Spring DB2 JPA實體管理器問題
- 9. 如何在Perl中實現鍵盤監聽器或動作監聽器
- 10. 如何實現監聽器?
- 11. 如何在持久化實體時創建事件監聽器
- 12. 如果實體監聽器中的實體管理器不能調用持久化
- 13. 如何添加可在Hibernate中編程的實體監聽器JPA
- 14. 使用JPA實體監聽堅持JPA實體
- 15. 如何獲得'enter'按鍵按鍵事件監聽器?
- 16. JPA(休眠)和設置實體監聽器上運行
- 17. 如何在運行時獲取weblogic管理的服務器監聽端口?
- 18. 排除領域JPA實體監聽
- 19. 事件監聽器?
- 20. 如何使JPA實體管理器忘記以前的異常?
- 21. 春監聽器容器與事務管理和重試諮詢訂購
- 22. 通過em.clear()重用實體管理器或創建新的實體管理器?
- 23. 事務開始時的監聽器
- 24. GWT請求工廠中的實體代理更改監聽器
- 25. Laravel監聽器監聽多個事件
- 26. 春季服務層沒有關閉Hibernate jpa實體管理器
- 27. Spring事務同步器在事務結束前關閉JPA實體管理器,當外鍵存在時
- 28. 如何獲取Spring事務管理器實例?
- 29. Java JPA,使用實體管理器設置事務隔離級別
- 30. 如何使用JPA setMaxResults()(LIMIT 20)沒有實體管理器?
我的問題是如何獲得在AvailableCreditListener類 – Muzy