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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值