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作为底层实现).你知道我是否需要创建该特定文件?如果是,我应该把它放在哪里?
提前致谢.
在你的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特定属性".
我假设你正在使用注释?如果是这样,您可以使用@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,等.
请注意,您还可以通过回调方法上的注释来指定这一点。将它们嵌入到实体本身中,或者嵌入到称为实体侦听器的单独类中。这是从文档中摘取的片段:
@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 配置中指定。但我认为注释更方便。