zoukankan      html  css  js  c++  java
  • Hibernate_事件监听

    事件监听是JDK中常见的一种模式。 Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会调用监听器类中的事件处理方法。在某些功能的设计中,既可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现。 

    Hibernate 定义了多个事件涵盖了持久化过程中的不同生命同期,即Session对象中的第一个方法均分别对应事件。调用某个方法时就会触发相应的事件,并被预先设置的监听器收到及处理。

      

    事件与监听器接口的对应关系

    事件类型

    对应的监听器接口

    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 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Hibernate中加载事件监听两种方式,一种是在hibernate.cfg.xml中进行加载,一种是在程序中进行加载

    如下:自定义事件监听器LogPostLoadEventListener.java:

    public class MyPostLoadEventListener implements PostLoadEventListener {
        @Override
        public void onPostLoad(PostLoadEvent arg0) {
            System.out.println("Class:" + arg0.getEntity().getClass().getName());
        }
    
    }

     在hibernate.cfg.xml中加载:

     1 <hibernate-configuration>
     2 
     3     <session-factory>
     4         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     5         <property name="connection.url">jdbc:mysql://localhost:3306/book</property>
     6         <property name="connection.username">yuan</property>
     7         <property name="connection.password">hanyuan9113</property>
     8         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
     9         <property name="myeclipse.connection.profile">mysql</property>
    10     
    11         <listener class="com.yun.MyPostLoadEventListener" type="post-load"/>
    12     </session-factory>
    13 
    14 </hibernate-configuration>

    在程序中加载:

         Configuration cfg = new Configuration();
            cfg.setListener("post-load", new MyPostLoadEventListener());
            cfg.configure();

     

    事件监听与拦截器的比较:

    事件监听与拦截器都可以拦截Session对象对持久化对象的操作动作,但是事件监听可以实现更加细化粒度上的拦截,同时还可以通过事件监听器对象获取所拦截的持久化对象修改前的状态值,并且能直接通过Event对象获取Session对象.

  • 相关阅读:
    mySQL优化方案
    java之自动过滤提交文本中的html代码script代码
    java小技术之生成二维码
    微信扫码支付功能详细教程————Java
    java实现发送邮件服务器,SMTP协议发送邮件
    『重构--改善既有代码的设计』读书笔记----序
    Linux导航神器-----autojump
    绘图时,根据size()和自定义rect编程的区别
    Qt中如何在QCursor移动的时候不触发moveEvent
    Qt远程机开发时光标注意问题
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2665938.html
Copyright © 2011-2022 走看看