使用事件系統時按如下步驟進行:
(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>
Hibernate事件監聽
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.