2012-10-18 41 views
6

我在使用Hibernate事件監聽器如PostDeleteEventListener, PostInsertEventListener, PostUpdateEventListener在插入,刪除和更新過程中執行一些操作。現在我想使用JPA偵聽器來做到這一點,因爲如果我想從Hibernate移動到任何其他JPA提供程序,我的偵聽器應該工作。 Hibernate監聽器給我從中我可以得到事務並檢查它是否提交或回滾。 JPA偵聽器僅向我提供實體對象。現在我怎樣才能獲得JPA偵聽器中的事務或會話或實體管理器?提前致謝!!我使用Jboss作爲我的CMT。如何獲得jpa監聽器中的實體管理器或事務

回答

6

這是不支持的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查找來獲取它。

-1

您可以使用所有前/後載荷,插入,更新或者使用兩種方式在JPA刪除監聽器:

  1. 通過使用註解。 使用監聽器可能是一個實體具有需要的實體已被持久化,更新或加載,如後要填充的瞬時變量的一個簡單的例子:

    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 
    } 
    
  2. 通過使用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> 
+6

我的問題是如何獲得在AvailableCreditListener類 – Muzy

1

對我來說,我使用此代碼:

ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); 
auditLogService = (AuditLogService) ctx.getBean("auditLogService"); 

這非常適用於我。

這個應用程序的代碼可以在https://bitbucket.org/macielbombonato/apolo

我希望這可以幫助你下載。

+0

中的entityManager這應該被注意爲「答案」,但明確的答案(對於一般情況),將獲得entityManager通過JNDI查找,但特定的綁定使用將是容器特定的(JBoss,Glassfish,Weblogic等) – him

相關問題