使用事件系统时按如下步骤进行:
(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事件监听
最新推荐文章于 2024-08-09 16:44:30 发布