Hibernate 拦截器实例

来源:互联网 发布:淘宝直通车创意 编辑:程序博客网 时间:2024/05/18 03:55

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

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

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

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

public class EntityInfo {public Object entityBean;public Serializable id;public String[] properties;public Object getEntityBean() {return entityBean;}public void setEntityBean(Object entityBean) {entityBean = entityBean;}public Serializable getId() {return id;}public void setId(Serializable id) {this.id = id;}public String[] getProperties() {return properties;}public void setProperties(String[] properties) {this.properties = properties;}public String toString(){String info = "";if(entityBean !=null){info = entityBean.getClass().toString()+"\r\nid:"+id+"\r\n";if(properties != null){//处理properties中的所有元素for(String property:properties){//得到getter方法名try {String getter = "get" + property.substring(0, 1).toUpperCase()+property.substring(1);//使用反射技术和gettter方法名获得Method对象Method method = entityBean.getClass().getMethod(getter);//调用gettter方法,并追加生成要返回的信息info = info + property + ":" +method.invoke(entityBean).toString() +"\r\n";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}return info;}}


实现拦截器类,代码如下

public class EntityBeanInterceptor extends EmptyInterceptor {private ThreadLocal entityBeans = new ThreadLocal();@Overridepublic void afterTransactionBegin(Transaction tx){entityBeans.set(new HashSet<EntityInfo>());}@Overridepublic void afterTransactionCompletion(Transaction tx){if(tx.wasCommitted()){Iterator i =  ((Collection)entityBeans.get()).iterator();while (i.hasNext()) {//在提交事务之后输出试题bean的内容EntityInfo info = (EntityInfo) i.next();//调用方法数据EntityBean对象processEntityBean(info);}}}private void processEntityBean(EntityInfo info){System.out.println(info);}@Overridepublic boolean onSave(Object entity,Serializable id, Object[] state,String[] propertyNames,Type[] types){EntityInfo info = new EntityInfo();info.entityBean = entity;info.properties = propertyNames;info.id =id;//在持久化对象后,将对象信息保存到当前线程的HashSet<EntityInfo>对象中((HashSet<EntityInfo>) entityBeans.get()).add(info);return false;}}


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

public class HibernateSessionFactory {/*其他代码省略*/private static ThreadLocal threadLocal = new ThreadLocal(); private  static Configuration configuration = new Configuration();    private static org.hibernate.SessionFactory sessionFactory;public static Session getSession(Interceptor... interceptor){Session session = (Session) threadLocal.get();if(session == null || !session.isOpen()){//如果session为空重新建立一个Session工厂if(sessionFactory == null){rebuildSessionFactory();}//如果interceptor参数值中包含拦截器对象,则安装该拦截器session = (sessionFactory != null)?((interceptor.length == 0)?sessionFactory.openSession():sessionFactory.openSession(interceptor[0])):null;//如果ThreadLocal对象中没有属于当前线程的session对象,则添加一个Session对象threadLocal.set(session);}}}



测试拦截器类

public class TestInterceptor {private void mian() {// TODO Auto-generated method stubSession session = HibernateSessionFactory.getSession(new EntityBeanInterceptor());Transaction tx = session.beginTransaction();//Customer是一个实体beanCustomer customer = new Customer();customer.setName("hqw");session.saveOrUpdate(customer);tx.commit();session.close();}}


这样在构造session时就注册了拦截器,应为本文在EntityInterceptor类中注册了在事务开始后、事务完成后、持久化后三个方法,所以在相应地方就会调用拦截器中的方法

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证被列入黑名单了怎么办 顺丰寄方客户要求退回快递费怎么办 蛋蛋被皮筋弹肿了怎么办 人肌肉里的绦虫卵怎么办 鞋子前面踢坏了怎么办 猫割完蛋蛋流东西怎么办 北京怡瑞被骗后怎么办 玩滑板睾丸碎了怎么办 雄鸽不会踩蛋怎么办 玩滑板蛋碎了怎么办 精子在精囊满了怎么办 孩子的睾丸一大一小怎么办 肾阳虚早射该怎么办 有奶水吸不出来怎么办 苹果mac商店里没有软件怎么办 战地1安装包损坏怎么办 战地4db显示数据异常怎么办 战地1亚服没人怎么办 战地一加载太慢怎么办 饥荒手机版怪物跟人就打狗包怎么办 电脑文件损坏开不了机怎么办 黑魂1武器损坏怎么办 系统注册表文件丢失或损坏怎么办 steam申诉填错信息怎么办 手机玩游戏老是闪退怎么办 美剧推荐不能看怎么办 最角两边有点烂怎么办 独显禁用了黑屏怎么办 目标文件夹访问被拒绝怎么办 苹果mac电脑很卡怎么办 未能成功安装设备驱动程序怎么办 mac更新系统卡住了怎么办 电脑卡住了文件没保存怎么办 迅雷卸载重装列表没了怎么办 多个dts文件音量不同怎么办 武装突袭3锁帧怎么办? 武装突袭3没子弹了怎么办 电脑系统注册表文件损坏怎么办 武装突袭3受伤了怎么办 模板跟旺铺版本不符合怎么办 cpu散热硅胶没了怎么办