Hibernate 事件监听
事件监听是JDK中常见的一种模式。 Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会调用监听器类中的事件处理方法。在某些功能的设计中,既可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现。
Hibernate 定义了多个事件涵盖了持久化过程中的不同生命同期,即Session对象中的第一个方法均分别对应事件。调用某个方法时就会触发相应的事件,并被预先设置的监听器收到及处理。
Hibernate中事件监听器接口均在org.hibernate.event包中,事件与监听器接口对应关系如下:
事件类型 对应的监听器接口
auto-flush AutoFlushEventListener
merge MergeEventListener
delete DeleteEventListener
persist PersistEventListener
dirty-check DirtyCheckEventListener
evict EvictEventListener
flush FlushEventListener
flush-entity FlushEntityEventListener
load LoadEventListener
load-collection LoadCollectionEventListener
lock LockEventListener
refresh RefreshEventListener
replicate ReplicateEventListener
save-update SaveUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-delete PreDeleteEventListener
pre-insert PreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-delete PostDeleteEventListener
post-insert PostInsertEventListener
注意:pre和post表示事件发生之前和之后。
Hibernate 事件监听的使用方法如下:
1、用户定制事件监听器首先需要与要处理事件相对应的接口,或者继承实现这个接口的类,然后通过 Hibernate的配置(hibernate.cfg.xml)配置事件监听器对象。如:
public class LogPostLoadEventListener implements PostLoadEventListener{
public void onPostLoad(PostLoadEvent event){
......
...
.....
}
}
在Hibernate的配置文件中使用<listener>标签添加事件监听器功能:
<mapping resource ="..." />
<listener type="post-load" class="com.kkoolerter.Listener.LogPostLoadEventListener" />
然而,也可以通过编程方式加载事件监听器对象:
Configuration cfg = new Configuration();
cfg.setListener("post-load",new LogPostLoadEventListener());
cfg.configure();
实现的代码如下:
public interface Auditable {
}
public class AuditLog implements Serializable {
private Integer id;
private String entityName;
private String entityId;
private Date createTime;
private String operationType;
....
}
public class Product implements Serializable ,Auditable{
private String id;
private String name;
private Double price;
private String description;
...
}
public enum OperationType {
LoAD,CREATE,UPDATE,DELETE
}
配置文件如下:
<hibernate-mapping>
<class name="com.kkoolerter.hibernate.beans.AuditLog">
<id name="id">
<generator class="increment" />
</id>
<property name="entityName" />
<property name="entityId" />
<property name="createTime" />
<property name="operationType" />
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.kkoolerter.hibernate.beans.Product">
<id name="id">
<generator class="uuid" />
</id>
<property name="name" />
<property name="price" />
<property name="description" />
</class>
</hibernate-mapping>
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/hibernate_listener
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="show_sql">true</property>
<mapping resource="com/kkoolerter/hibernate/beans/AuditLog.hbm.xml" />
<mapping resource="com/kkoolerter/hibernate/beans/Product.hbm.xml" />
<listener type="post-insert"
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />
<listener type="post-update"
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />
<listener type="post-delete"
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />
</session-factory>
</hibernate-configuration>
实现监听器的类:
public class AuditLogEventListener implements PostUpdateEventListener,
PostInsertEventListener, PostDeleteEventListener {
private static final long serialVersionUID = 1L;
public void onPostUpdate(PostUpdateEvent event) {
if(event.getEntity() instanceof Auditable){
String entityName = event.getEntity().getClass().getName();
AuditLog log = new AuditLog();
log.setEntityName(entityName);
log.setOperationType(OperationType.UPDATE.toString());
log.setEntityId(event.getId().toString());
log.setCreateTime(new Date());
this.saveAuditLog(event.getSession(), log);
}
}
public void onPostInsert(PostInsertEvent event) {
if(event.getEntity() instanceof Auditable){
String entityName = event.getEntity().getClass().getName();
AuditLog log = new AuditLog();
log.setEntityName(entityName);
log.setOperationType(OperationType.CREATE.toString());
log.setEntityId(event.getId().toString());
log.setCreateTime(new Date());
this.saveAuditLog(event.getSession(), log);
}
}
public void onPostDelete(PostDeleteEvent event) {
if(event.getEntity() instanceof Auditable){
String entityName = event.getEntity().getClass().getName();
AuditLog log = new AuditLog();
log.setEntityName(entityName);
log.setOperationType(OperationType.DELETE.toString());
log.setEntityId(event.getId().toString());
log.setCreateTime(new Date());
this.saveAuditLog(event.getSession(), log);
}
}
private void saveAuditLog(Session session,AuditLog log){
Session logSession = session.getSessionFactory().openSession();
Transaction tx = logSession.beginTransaction();
try {
tx.begin();
logSession.save(log);
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}
}
}
测试代码:
public class ListenerTest extends TestCase{
public void testAdd(){
Product p1 = new Product();
p1.setDescription("Product 2");
p1.setName("p2");
p1.setPrice(3.3);
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
session.save(p1);
tx.commit();
HibernateUtils.closeSession(session);
}
public void testUpdate(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Product p = (Product)session.get(Product.class,"402881ff278fefcf01278fefd0fe0001");
//session.save(p1);
p.setName("product 1");
session.saveOrUpdate(p);
tx.commit();
HibernateUtils.closeSession(session);
}
public void testDelete(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Product p = (Product)session.get(Product.class,"402881ff278fefcf01278fefd0fe0001");
//session.save(p1);
//p.setName("product 1");
session.delete(p);
tx.commit();
HibernateUtils.closeSession(session);
}
}
分享到:
相关推荐
### 解决Hibernate监听器死循环问题 #### 一、背景介绍 在开发基于Spring和Hibernate(简称SH架构)的应用程序时,可能会遇到由于监听器配置不当导致的死循环问题。这种情况通常表现为应用程序试图无限次地执行同一...
在Java的持久化框架Hibernate中,事件监听机制是其核心特性之一,它允许开发者在特定的数据操作前后执行自定义逻辑。这里的"hibernate事件 刷新事件.zip"资源可能包含了关于如何理解和应用Hibernate中的刷新事件...
Hibernate 中大量数据的更新 Hibernate 是一个流行的基于 Java 的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和...
13. **事件监听器**:Hibernate允许定义事件监听器来处理特定的数据库操作,如对象的保存、更新、删除等事件。 14. **性能优化**:文档还会涵盖如何通过批处理、预加载、缓存策略等手段优化Hibernate的性能。 以上...
9. **事件监听器**:通过事件监听机制,开发者可以在特定操作(如对象的保存、更新或删除)前后执行自定义逻辑。 10. **增强的性能**:通过延迟加载、批处理和缓存机制,Hibernate能够在不牺牲性能的情况下提供强大...
11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...
9. **事件监听器**:允许自定义事件监听器来扩展Hibernate的功能,如在对象保存或更新时触发某些操作。 10. **类型转换**:Hibernate提供了一系列的类型转换器,用于处理Java类型与数据库类型的转换。 通过学习和...
12. **事件监听器**:通过实现特定接口,可以添加监听器来监控对象的生命周期事件,如预加载、加载、保存、更新和删除。 13. **元数据(Metadata)**:Hibernate可以从注解或XML中获取元数据,生成SQL语句,实现了...
七、事件监听器 Hibernate支持事件驱动编程,如PreInsertEventListener、PostLoadEventListener等,允许用户在特定操作前或后进行自定义处理。 八、持久化操作 - 保存(save()):为新对象生成ID并将其放入一级缓存...
高级特性部分可能包含懒加载、缓存机制、二级缓存、性能优化、事件监听器、拦截器等。懒加载是Hibernate优化性能的一种策略,它延迟加载关联的对象,直到真正需要时才执行数据库查询。缓存机制可以提高数据访问速度...
- **Hibernate事件监听器**: 可以通过实现特定的监听器接口,如PreInsertEventListener,来监听和处理对象的生命周期事件。 - **Hibernate拦截器**: 类似于监听器,但更灵活,可以直接修改对象的状态。 总结来说,...
2. 实体监听器:通过实现EntityListener接口,开发者可以在特定的生命周期事件(如保存、更新、删除等)中执行自定义逻辑,提高了代码的复用性和灵活性。 三、SQL日志生成 Hibernate-Extensions能够自动记录和打印...
13. **事件监听器**:Hibernate提供了事件监听机制,开发者可以实现特定的监听器接口,对对象的生命周期事件(如加载、保存、更新、删除等)进行拦截和自定义处理。 14. **JPA(Java Persistence API)兼容性**:...
这份文档还涵盖了高级主题,如 Criteria API 的使用、Hibernate事件监听器、实体的懒加载和立即加载策略、多对多关联映射等。对于任何希望深入理解和使用 Hibernate 的开发者来说,这是一份不可或缺的学习资料。通过...
这些扩展可能包括对CGLIB或JPA的支持,也可能包含了一些自定义的拦截器、事件监听器或者更高级的查询构建工具。Hibernate Extensions使开发者能够更好地定制和扩展他们的Hibernate应用,以满足项目特定的需求。 在...
8. **事件监听器**:Hibernate 3.2.5支持事件监听机制,可以通过实现特定接口并注册监听器,对对象的生命周期事件(如加载、保存、更新、删除等)进行自定义处理。 9. **多态性支持**:Hibernate支持多态查询,能够...
10. **事件监听器**: Hibernate支持事件监听,可以在对象生命周期的不同阶段执行自定义逻辑,如在对象保存前、后,加载前、后等。 "Hibernate.htm"文件很可能是这个帮助文档的主要内容,包含了上述所有知识点的...
- **事件监听器**:探索EntityListener和Interceptor,它们可以在对象生命周期中的特定事件上执行自定义逻辑。 - **性能优化**:学习如何通过调整缓存策略、批处理、连接池配置等手段提高Hibernate的性能。 总之,...
10. **事件监听器**:Hibernate支持事件监听,可以定义监听器来处理对象的生命周期事件,如加载、保存、更新和删除。 11. **类型转换**:Hibernate提供了丰富的类型系统,包括基本类型、自定义类型和组件类型,可以...