2010-03-02 62 views
6

Hy guys,在JPA環境中聲明Hibernate事件偵聽器

我正在開發一個在Java EE 5環境中開發的項目。我想知道如何聲明一個Hibernate事件監聽器,以便在CRUD操作執行時通知我。

我讀過,我必須在Hibernate配置文件中聲明*cfg.xml是這樣的:

<hibernate-configuration> 
    <session-factory> 
     ... 
     <event type="load"> 
      <listener class="com.eg.MyLoadListener"/> 
      <listener class="org.hibernate.event.def.DefaultLoadEventListener"/> 
     </event> 
    </session-factory> 
</hibernate-configuration> 

的問題是我沒有在這個項目這樣的文件。我們使用JPA(Hibernate作爲底層實現)。你知道我是否需要創建特定的文件?如果是,我應該在哪裏放?

在此先感謝。

+1

你好,你有答案嗎? – Scarlett 2012-04-12 09:23:46

回答

4

請注意,您也可以在回調方法中指定此註釋。要麼將它們嵌入到實體本身中,要麼嵌入到一個單獨的類中,稱爲實體監聽器。下面是從documentation採取的一個片段:

@Entity 
@EntityListeners(class=Audit.class) 
public class Cat { 

    @Id private Integer id; 
    private String name; 

    @PostLoad 
    public void calculateAge() { 
     ... 
    } 
} 

public class LastUpdateListener { 

    @PreUpdate 
    @PrePersist 
    public void setLastUpdate(Cat o) { 
     ... 
    } 
} 

我猜你也可以指定在XML配置。但我認爲註釋更方便。

+0

謝謝, 但我認爲這些是JPA實體監聽器。我嘗試了這些,我遇到了一些問題。我想直接嘗試Hibernate事件監聽器。 – user284400 2010-03-02 13:16:24

5

我假設您使用註釋?如果是這樣,你可以使用@EntityListeners註釋要做到這一點,就像這樣:

@MappedSuperclass 
@EntityListeners(AbstractEntityListener.class) 
public abstract class AbstractEntity { 
    ... 
} 

你的實體監聽器類可以是這樣的:

public class AbstractEntityListener { 

    /** 
    * Set creation and lastUpdated date of the entity. 
    * 
    * @param entity {@link AbstractEntity} 
    */ 
    @PrePersist 
    @PreUpdate 
    public void setDate(final AbstractEntity entity) { 
     final Date now = new Date(); 
     entity.setModified(now); 
    } 

} 

有可捕獲不同的事件不同的註解,如@PrePersist@PreUpdate@PostLoad

+0

不,問題實際上是在使用JPA時,何處放置hibernate特定的配置。 – ewernli 2010-03-02 14:01:40

+1

@ewernli:「我想知道如何聲明Hibernate事件偵聽器,以便在執行CRUD操作時通知我。」我認爲,我的答案解決了這個問題,沒有任何麻煩的Hibernate特技。 – Henning 2010-03-02 14:04:26

+0

我已經刪除了舊的答案,以便您可以從OP中看到答案。出於某種原因,他不想使用實體監聽器。否則我會分享你的意見。 – ewernli 2010-03-02 14:12:50

2

好像你可以將特定的通常hibnerate.cfg.xml作爲屬性hibernate.ejb.cfgfile

您也可以定義在平時所有的休眠 配置Hibernate的 方式:一個hibernate.xfg.xml文件中。 您必須告訴JPA實施 通過 hibernate.ejb.cfgfile屬性使用此配置文件。

查看this帖子或this one。

<persistence> 
<persistence-unit name="manager1" transaction-type="JTA"> 
    <jta-data-source>java:/DefaultDS</jta-data-source> 
    <properties> 
     <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/> 
    </properties> 
</persistence-unit> 
</persistence> 

請注意,我從來沒有親自使用過。

6

在你的persistence.xml:

<persistence> 
    <persistence-unit name="myPersistenceUnit"> 
     ... 
     <snip/> 
     ... 
     <properties> 
      <property name="hibernate.ejb.event.load" value="com.eg.MyLoadListener,org.hibernate.event.def.DefaultLoadEventListener"/>  
     </properties> 
    </persistence-unit> 
</persistence> 

Hibernate EntityManager docs看 「表2.1 Hibernate的實體管理器特定的屬性。」 對所有適用的屬性。