在JPA环境中声明Hibernate事件侦听器

use*_*400 7 java events hibernate jpa listener

Hy伙计们,

我正在开发一个在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>
Run Code Online (Sandbox Code Playgroud)

问题是我在项目中没有这样的文件.我们正在使用JPA(以Hibernate作为底层实现).你知道我是否需要创建该特定文件?如果是,我应该把它放在哪里?

提前致谢.

mtp*_*typ 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>
Run Code Online (Sandbox Code Playgroud)

Hibernate EntityManager文档中,查看所有适用属性的"表2.1.Hibernate Entity Manager特定属性".


Hen*_*ing 5

我假设你正在使用注释?如果是这样,您可以使用@EntityListeners注释来执行此操作,如下所示:

@MappedSuperclass
@EntityListeners(AbstractEntityListener.class)
public abstract class AbstractEntity {
    ...
}
Run Code Online (Sandbox Code Playgroud)

您的实体侦听器类可能如下所示:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

有可捕获不同的事件,如不同的注解@PrePersist,@PreUpdate,@PostLoad,等.


ewe*_*nli 4

请注意,您还可以通过回调方法上的注释来指定这一点。将它们嵌入到实体本身中,或者嵌入到称为实体侦听器的单独类中。这是从文档中摘取的片段:

@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) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想您也可以在 XML 配置中指定。但我认为注释更方便。