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

          hbn 攔截器

          Posted on 2007-11-29 10:13 G_G 閱讀(1024) 評論(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



          主站蜘蛛池模板: 宜兴市| 定陶县| 辛集市| 卓尼县| 抚州市| 都江堰市| 康乐县| 融水| 桑日县| 巴南区| 博罗县| 舒城县| 乌海市| 仁寿县| 惠来县| 集贤县| 格尔木市| 尼木县| 涿鹿县| 永福县| 巴青县| 张家港市| 田东县| 深圳市| 金沙县| 黔江区| 屯门区| 青浦区| 镇赉县| 承德市| 潞西市| 荔波县| 炎陵县| 宝清县| 图片| 靖远县| 昭通市| 乐陵市| 和林格尔县| 云南省| 罗源县|