Hibernate事件系统&监听器

来源:互联网 发布:日韩和欧美 知乎 编辑:程序博客网 时间:2024/05/17 07:42
使用事件系统时按如下步骤进行:
(
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>
 
原创粉丝点击