Hibernate事件監聽

 

使用事件系統時按如下步驟進行:
(1)實現自己的事件監聽器類
(2)註冊自定義事件監聽器,代替系統默認的事件監聽器
通常,繼承系統默認的事件監聽器:擴展特定方法
下面是用戶自定義監聽器的示例:
//自定義LoadListener,繼承默認的DefaultLoadEventListener實現類
public class MyLoadListener extends DefaultLoadEventListener
...{
    //在LoadEventListener接口僅僅定義了這個方法
    public Object onLoad(LoadEvent event,
        LoadEventListener.LoadTye loadType) throws HibernateException
    ...{
        //先調用父類的onLoad方法,從而完成默認的持久化操作
        Object o = super.onLoad(event, loadType);
        //加入用戶的自定義處理
        System.out.println("自定義的load事件");
        System.out.println(event.getEntityClassName() + "==================="
         + event.getEntityId());
        return o;
    }
}
下面還有一個MySaveListener,用於監聽SaveEvent事件:
//自定義SaveListener,繼承默認的DefaultSaveEventListener實現類
public class MySaveListener extends DefaultSaveEventListener
...{
    //該方法完成實際的數據插入操作
    protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event)
    ...{
        //先執行用戶自定義的操作
        System.out.println(event.getObject());
        //調用父類的默認持久化操作
        return super.performSaveOrUpdate(event);
    }
}
註冊用於自定義監聽器也有以下兩種方法:
*編程式:通過使用Cofiguration對象編程註冊
*聲明式:在Hibernate的XML格式的配置文件中進行聲明,使用Properties格式的
        配置文件將無法配置自定義監聽器
通過編程式方式使用自定義監聽器的代碼如下:
public class HibernateUtil2
...{
    //靜態類屬性 SessionFactory
    public static final SessionFactory sessionFactory;
    //靜態初始化塊,完成靜態屬性的初始化
    static
    ...{
        try
        ...{
            Configuration cfg = new Cofiguration();
            //註冊loadEventListener監聽器
            cfg.getSessionEventListenerConfig().setLoadEventListener(
                    new MyLoadListener());
            //註冊saveEventListener監聽器
            cfg.getSessionEventListenerConfig().setSaveEventListener(
                    new MyLoadListener());
            //由Cofiguration的實例來創建一個SessionFactory實例
            sessionFactory = cfg.configure().buildSessionFactory();
        }
        catch (Throwable ex)
        ...{
            System.err.println("初始化sessionFactory失敗." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static final ThreadLocal session = new ThreadLocal();
    //不加攔截器的打開Session方法
    public static Session currentSession() throws HibernateException
    ...{
        Session s = (Session)session.get();
        if (s == null)
        ...{
            s = sessionFactory.openSession();
            sesstion.set(s);
        }
        return s;
    }
    public static void closeSession() throws HibernateException
    ...{
        Session s = (Session) session.get();
        if (s != null)
            s.close();
        session.set(null);
    }
}
如果不想修改代碼,也可以在配置文件中使用事件監聽器,註冊事件監聽器的
Hibernate配置文件代碼如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!--JDBC connection pool(use the built-in)-->
        <property name="connection.pool_size">5</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <!--列出所有的持久化映射文件-->
        <mapping resource="User.hbm.xml"/>
        <!--註冊事件監聽器-->
        <listener type="load" class="prolove.MyLoadListener"/>
        <listener type="save" class="prolove.MySaveListener"/>
    </session-factory>
</hibernate-configuration>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章