Hibernate 拦截器实例

Hibernate 在操作数据库的时候要执行很多操作,这些动作对用户是透明的。这些操作主要是有拦截器和时间组成

 hibernate拦截器可以拦截大多数动作,比如事务开始之后(afterTransactionBegin)、事务完成之前(beginTransactionCompletion)、事务完成之后(afterTransactionCompletion)、持久化对象之前(onSave),一个拦截器必须实现org.hibernate.Interceptor借口,hibernate提供了一个实现该借口的类EmptyInterceptor类

下面编写一个hibernate实例来说明hibernate拦截器的作用

首先编写一个保存持久化对象的信息类EntityInfo

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public class EntityInfo {  

  2.   

  3.     public Object entityBean;  

  4.     public Serializable id;  

  5.     public String[] properties;  

  6.     public Object getEntityBean() {  

  7.         return entityBean;  

  8.     }  

  9.     public void setEntityBean(Object entityBean) {  

  10.         entityBean = entityBean;  

  11.     }  

  12.     public Serializable getId() {  

  13.         return id;  

  14.     }  

  15.     public void setId(Serializable id) {  

  16.         this.id = id;  

  17.     }  

  18.     public String[] getProperties() {  

  19.         return properties;  

  20.     }  

  21.     public void setProperties(String[] properties) {  

  22.         this.properties = properties;  

  23.     }  

  24.     public String toString()  

  25.     {  

  26.         String info = "";  

  27.         if(entityBean !=null){  

  28.             info = entityBean.getClass().toString()+"\r\nid:"+id+"\r\n";  

  29.             if(properties != null){  

  30.                 //处理properties中的所有元素  

  31.                 for(String property:properties){  

  32.                     //得到getter方法名  

  33.                     try {  

  34.                         String getter = "get" + property.substring(01).toUpperCase()+property.substring(1);  

  35.                         //使用反射技术和gettter方法名获得Method对象  

  36.                         Method method = entityBean.getClass().getMethod(getter);  

  37.                         //调用gettter方法,并追加生成要返回的信息  

  38.                         info = info + property + ":" +method.invoke(entityBean).toString() +"\r\n";  

  39.                     } catch (Exception e) {  

  40.                         // TODO Auto-generated catch block  

  41.                         e.printStackTrace();  

  42.                     }  

  43.                 }  

  44.             }  

  45.         }  

  46.         return info;  

  47.     }  

  48. }  



[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1.   

实现拦截器类,代码如下

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public class EntityBeanInterceptor extends EmptyInterceptor {  

  2.     private ThreadLocal entityBeans = new ThreadLocal();  

  3.       

  4.     @Override  

  5.     public void afterTransactionBegin(Transaction tx){  

  6.         entityBeans.set(new HashSet<EntityInfo>());  

  7.     }  

  8.     @Override  

  9.     public void afterTransactionCompletion(Transaction tx){  

  10.         if(tx.wasCommitted()){  

  11.             Iterator i =  ((Collection)entityBeans.get()).iterator();  

  12.             while (i.hasNext()) {  

  13.                 //在提交事务之后输出试题bean的内容  

  14.                 EntityInfo info = (EntityInfo) i.next();  

  15.                 //调用方法数据EntityBean对象  

  16.                 processEntityBean(info);  

  17.             }  

  18.         }  

  19.     }  

  20.       

  21.       

  22.     private void processEntityBean(EntityInfo info){  

  23.         System.out.println(info);  

  24.     }  

  25.       

  26.     @Override  

  27.     public boolean onSave(Object entity,Serializable id, Object[] state,String[] propertyNames,Type[] types){  

  28.         EntityInfo info = new EntityInfo();  

  29.         info.entityBean = entity;  

  30.         info.properties = propertyNames;  

  31.         info.id =id;  

  32.         //在持久化对象后,将对象信息保存到当前线程的HashSet<EntityInfo>对象中  

  33.         ((HashSet<EntityInfo>) entityBeans.get()).add(info);  

  34.         return false;  

  35.     }  

  36.       

  37.   

  38. }  



注册拦截器类,本例中在构造Session时创建拦截器类

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public class HibernateSessionFactory {  

  2.     /*其他代码省略*/  

  3.     private static ThreadLocal threadLocal = new ThreadLocal();  

  4.      private  static Configuration configuration = new Configuration();  

  5.         private static org.hibernate.SessionFactory sessionFactory;  

  6.     public static Session getSession(Interceptor... interceptor){  

  7.           

  8.         Session session = (Session) threadLocal.get();  

  9.         if(session == null || !session.isOpen()){  

  10.             //如果session为空重新建立一个Session工厂  

  11.             if(sessionFactory == null){  

  12.                 rebuildSessionFactory();  

  13.             }  

  14.             //如果interceptor参数值中包含拦截器对象,则安装该拦截器  

  15.             session = (sessionFactory != null)?((interceptor.length == 0)?sessionFactory.openSession():sessionFactory.openSession(interceptor[0])):null;  

  16.             //如果ThreadLocal对象中没有属于当前线程的session对象,则添加一个Session对象  

  17.             threadLocal.set(session);  

  18.         }  

  19.     }  

  20.   

  21. }  




[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1.   

测试拦截器类

[java] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public class TestInterceptor {  

  2.   

  3.   

  4. private void mian() {  

  5. // TODO Auto-generated method stub  

  6. Session session = HibernateSessionFactory.getSession(new EntityBeanInterceptor());  

  7. Transaction tx = session.beginTransaction();  

  8. //Customer是一个实体bean  

  9. Customer customer = new Customer();  

  10. customer.setName("hqw");  

  11. session.saveOrUpdate(customer);  

  12. tx.commit();  

  13. session.close();  

  14. }  

  15. }  


转载于:https://my.oschina.net/haquanwen/blog/189909

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值