2010-03-02 32 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的实体管理器特定的属性。” 对所有适用的属性。