posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          hbn 攔截器

          Posted on 2007-11-29 10:13 G_G 閱讀(1025) 評論(0)  編輯  收藏 所屬分類: hibernate
          攔截器
          package ?hbn.test.supper.Interceptor;

          import ?java.io.Serializable;
          import ?java.util.HashSet;
          import ?java.util.Iterator;
          import ?java.util.Set;

          import ?org.hibernate.CallbackException;
          import ?org.hibernate.EntityMode;
          import ?org.hibernate.Interceptor;
          import ?org.hibernate.Transaction;
          import ?org.hibernate.type.Type;

          public ? class ?TestInterceptor? implements ?Interceptor,Serializable{

          ????
          private ?Set?inserts? = ? new ?HashSet();
          ????
          private ?Set?updates? = ? new ?HashSet();
          ????
          ?? ?
          // Session初化一個持久對象 如果這方法中改變了對象屬性就返回true 否則null
          ???? public ? boolean ?onLoad(Object?entity,?Serializable?id,?Object[]?state,?String[]?propertyNames,?Type[]?types)? throws ?CallbackException?{
          ????
          ??? return ? false ;
          ????}
          ??? // Session flush()中檢查到臟數據是調用 如:tr.commit() ....
          ???? public ? boolean ?onFlushDirty(Object?entity,?Serializable?id,?Object[]?currentState,?Object[]?previousState,?String[]?propertyNames,?Type[]?types)? throws ?CallbackException?{
          ????????updates.add(entity);
          ????????
          return ? false ;
          ????}
          ???
          // Session Save() 當修改了對象屬性返回true
          ???? public ? boolean ?onSave(Object?entity,?Serializable?id,?Object[]?state,?String[]?propertyNames,?Type[]?types)? throws ?CallbackException?{
          ????????
          ????????inserts.add(entity);
          ????????
          return ? false ;
          ????}
          ????
          // delete
          ???? public ? void ?onDelete(Object?entity,?Serializable?id,?Object[]?state,?String[]?propertyNames,?Type[]?types)? throws ?CallbackException?{
          ????}
          ? ?? //flush() 之前調用
          ???? public ? void ?preFlush(Iterator?entities)? throws ?CallbackException?{
          ????}
          ????
          // flush() 執行SQL語句之后調用
          ???? public ? void ?postFlush(Iterator?entities)? throws ?CallbackException?{
          ????????
          ????????
          try ?{
          ????????????
          for (Iterator?it? = ?updates.iterator();it.hasNext();){
          ????????????????System.out.println(
          " update= " + ?it.next()?);????
          ????????????}
          ????????????
          for (Iterator?it? = ?inserts.iterator();it.hasNext();){
          ????????????????System.out.println(
          " insert " + ?it.next()?);????
          ????????????}
          ????????????
          ????????}?
          catch ?(Exception?e)?{
          ????????????e.printStackTrace();
          ????????}
          ????????
          ????}

          ????
          public ?Boolean?isTransient(Object?entity)?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ???????? return ? null ;
          ????}
          ? ? //決定Session中那些對象是臟數據 如果null Session使用默認處理臟數據
          ???? public ? int []?findDirty(Object?entity,?Serializable?id,?Object[]?currentState,?Object[]?previousState,?String[]?propertyNames,?Type[]?types)?{
          ???????? return ? null ;
          ????}

          ????
          // 當Session構造實體類對象前調用
          ???? public ?Object?instantiate(String?entityName,?EntityMode?entityMode,?Serializable?id)? throws ?CallbackException?{
          ???????? return ? null ;
          ????}

          ????
          public ?String?getEntityName(Object?object)? throws ?CallbackException?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ???????? return ? null ;
          ????}

          ????
          public ?Object?getEntity(String?entityName,?Serializable?id)? throws ?CallbackException?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ???????? return ? null ;
          ????}

          ????
          public ? void ?afterTransactionBegin(Transaction?tx)?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ????????
          ????}

          ????
          public ? void ?beforeTransactionCompletion(Transaction?tx)?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ????????
          ????}

          ????
          public ? void ?afterTransactionCompletion(Transaction?tx)?{
          ????????
          // ?TODO?Auto-generated?method?stub
          ????????
          ????}

          }

          測試

          package ?hbn.test.supper.Interceptor;

          import ?java.lang.reflect.Field;

          import ?org.hibernate.Session;
          import ?org.hibernate.SessionFactory;
          import ?org.hibernate.Transaction;

          import ?hbn.HibernateSessionFactory;
          import ?hbn.bean.T2oo;
          import ?junit.framework.TestCase;

          public ? class ?TestIC? extends ?TestCase?{
          ????
          private ?SessionFactory?sessionFactory;
          ????
          protected ? void ?setUp()? throws ?Exception?{
          ????????
          super .setUp();
          ????????
          // 利用java反射得到?HibernateSessionFactory?->
          ????????
          // private??static?org.hibernate.SessionFactory?sessionFactory;
          ????????
          // 要模擬?并發?要?HibernateSessionFactory?得出的?有?threadLocal?不行?
          ????????HibernateSessionFactory.currentSession();
          ????????HibernateSessionFactory.closeSession();
          ????????Field?field?
          = ?HibernateSessionFactory. class .getDeclaredField( " sessionFactory " );
          ????????field.setAccessible(
          true );
          ????????sessionFactory?
          = ?(SessionFactory)?field.get(HibernateSessionFactory. class );
          ????}
          ????
          ????
          public ? void ?testInc()? throws ?Exception?{
          ????????TestInterceptor?intx?
          = ? new ?TestInterceptor();
          ????????
          // 加載攔截器
          ????????Session?session? = ?sessionFactory.openSession(intx);
          ????????
          ????????Transaction?tr?
          = ?session.beginTransaction();
          ????????T2oo?t2?
          = ? new ?T2oo( 23 );
          ????????session.save(t2);
          ????????t2.setAvg(
          new ?Integer( 99 ));
          ????????tr.commit();
          ????}
          }
          結果
          Hibernate: insert into t2oo (version, avg, aid, id) values (?, ?, ?, ?)
          Hibernate: update t2oo set version=?, avg=?, aid=? where id=? and version=?
          //攔截到的
          update=hbn.bean.T2oo@277
          inserthbn.bean.T2oo@277



          主站蜘蛛池模板: 莱芜市| 泌阳县| 宁波市| 焦作市| 鄂托克前旗| 蓝山县| 巴彦淖尔市| 庄浪县| 渑池县| 宁陕县| 蓝山县| 盐亭县| 定结县| 洪泽县| 丰城市| 诸暨市| 南康市| 疏勒县| 深泽县| 安乡县| 尤溪县| 淳化县| 沭阳县| 鲜城| 永丰县| 武山县| 六枝特区| 闵行区| 恭城| 温州市| 唐河县| 开平市| 永顺县| 庆安县| 永寿县| 伊宁市| 南投市| 山丹县| 米林县| 临武县| 池州市|