`
cgp17
  • 浏览: 23503 次
社区版块
存档分类
最新评论

[转]Hibernate 事件监听

阅读更多
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);
    }

}
分享到:
评论
2 楼 monkmonk0 2012-02-09  
我想问下,pre和post分别在什么地方使用啊,post执行时要保存的数据是不是已经入库了
1 楼 monkmonk0 2012-02-09  

相关推荐

    解决hibernate监听器死循环问题

    ### 解决Hibernate监听器死循环问题 #### 一、背景介绍 在开发基于Spring和Hibernate(简称SH架构)的应用程序时,可能会遇到由于监听器配置不当导致的死循环问题。这种情况通常表现为应用程序试图无限次地执行同一...

    hibernate事件 刷新事件.zip

    在Java的持久化框架Hibernate中,事件监听机制是其核心特性之一,它允许开发者在特定的数据操作前后执行自定义逻辑。这里的"hibernate事件 刷新事件.zip"资源可能包含了关于如何理解和应用Hibernate中的刷新事件...

    Hibernate中大量数据的更新

    Hibernate 中大量数据的更新 Hibernate 是一个流行的基于 Java 的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在将大量数据插入到数据库时,Hibernate 经常会出现性能和...

    hibernate 3.6 中文 chm

    13. **事件监听器**:Hibernate允许定义事件监听器来处理特定的数据库操作,如对象的保存、更新、删除等事件。 14. **性能优化**:文档还会涵盖如何通过批处理、预加载、缓存策略等手段优化Hibernate的性能。 以上...

    Hibernate3的依赖包

    9. **事件监听器**:通过事件监听机制,开发者可以在特定操作(如对象的保存、更新或删除)前后执行自定义逻辑。 10. **增强的性能**:通过延迟加载、批处理和缓存机制,Hibernate能够在不牺牲性能的情况下提供强大...

    hibernate3.zip 包含hibernate3.jar

    11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...

    hibernate-release-5.2.10

    9. **事件监听器**:允许自定义事件监听器来扩展Hibernate的功能,如在对象保存或更新时触发某些操作。 10. **类型转换**:Hibernate提供了一系列的类型转换器,用于处理Java类型与数据库类型的转换。 通过学习和...

    hibernate5.2.9

    12. **事件监听器**:通过实现特定接口,可以添加监听器来监控对象的生命周期事件,如预加载、加载、保存、更新和删除。 13. **元数据(Metadata)**:Hibernate可以从注解或XML中获取元数据,生成SQL语句,实现了...

    hibernate-3.2源代码

    七、事件监听器 Hibernate支持事件驱动编程,如PreInsertEventListener、PostLoadEventListener等,允许用户在特定操作前或后进行自定义处理。 八、持久化操作 - 保存(save()):为新对象生成ID并将其放入一级缓存...

    Hibernate实战

    高级特性部分可能包含懒加载、缓存机制、二级缓存、性能优化、事件监听器、拦截器等。懒加载是Hibernate优化性能的一种策略,它延迟加载关联的对象,直到真正需要时才执行数据库查询。缓存机制可以提高数据访问速度...

    hibernate框架基本包

    - **Hibernate事件监听器**: 可以通过实现特定的监听器接口,如PreInsertEventListener,来监听和处理对象的生命周期事件。 - **Hibernate拦截器**: 类似于监听器,但更灵活,可以直接修改对象的状态。 总结来说,...

    Hibernate-extensions 完整安装包

    2. 实体监听器:通过实现EntityListener接口,开发者可以在特定的生命周期事件(如保存、更新、删除等)中执行自定义逻辑,提高了代码的复用性和灵活性。 三、SQL日志生成 Hibernate-Extensions能够自动记录和打印...

    hibernate

    13. **事件监听器**:Hibernate提供了事件监听机制,开发者可以实现特定的监听器接口,对对象的生命周期事件(如加载、保存、更新、删除等)进行拦截和自定义处理。 14. **JPA(Java Persistence API)兼容性**:...

    hibernate3中文官方文档

    这份文档还涵盖了高级主题,如 Criteria API 的使用、Hibernate事件监听器、实体的懒加载和立即加载策略、多对多关联映射等。对于任何希望深入理解和使用 Hibernate 的开发者来说,这是一份不可或缺的学习资料。通过...

    Middlegen-Hibernate-r5,hibernate-extensions-2.1.3

    这些扩展可能包括对CGLIB或JPA的支持,也可能包含了一些自定义的拦截器、事件监听器或者更高级的查询构建工具。Hibernate Extensions使开发者能够更好地定制和扩展他们的Hibernate应用,以满足项目特定的需求。 在...

    hibernate 3,25

    8. **事件监听器**:Hibernate 3.2.5支持事件监听机制,可以通过实现特定接口并注册监听器,对对象的生命周期事件(如加载、保存、更新、删除等)进行自定义处理。 9. **多态性支持**:Hibernate支持多态查询,能够...

    Hibernate帮助文档

    10. **事件监听器**: Hibernate支持事件监听,可以在对象生命周期的不同阶段执行自定义逻辑,如在对象保存前、后,加载前、后等。 "Hibernate.htm"文件很可能是这个帮助文档的主要内容,包含了上述所有知识点的...

    Hibernate源码

    - **事件监听器**:探索EntityListener和Interceptor,它们可以在对象生命周期中的特定事件上执行自定义逻辑。 - **性能优化**:学习如何通过调整缓存策略、批处理、连接池配置等手段提高Hibernate的性能。 总之,...

    最新的hibernate3.6.0jar包

    10. **事件监听器**:Hibernate支持事件监听,可以定义监听器来处理对象的生命周期事件,如加载、保存、更新和删除。 11. **类型转换**:Hibernate提供了丰富的类型系统,包括基本类型、自定义类型和组件类型,可以...

Global site tag (gtag.js) - Google Analytics