You smiled and talked to me of nothing and I felt that for this I had been waiting long.

          The trees come up to my window like the yearning voice of the dumb earth.

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            19 Posts :: 10 Stories :: 25 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(4)

          隨筆分類(34)

          隨筆檔案(30)

          收藏夾(10)

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          回顧hibernate refernce,在自定義hibernate intecerptor,events listencer模塊,假設了個實現針對某個對象數據操作,要求實現操作日志的記錄的功能需求,以下是實現方案的記錄:
          方案1:采用hibernate interceptor實現:
          public class SampleEntityInterceptor extends EmptyInterceptor {
              
          private static final long serialVersionUID = 1L;
              
          protected Log logger = LogFactory.getLog(SampleEntityInterceptor.class);

              @Override
              
          public void onDelete(Object entity, Serializable id, Object[] state,
                      String[] propertyNames, Type[] types) {
                  logger.info(
          " ### SampleEntityInterceptor.onDelete:");
                  // process......
              }

              @Override
              
          public boolean onLoad(Object entity, Serializable id, Object[] state,
                      String[] propertyNames, Type[] types) {
                  logger.info(
          " ### SampleEntityInterceptor.onLoad:");
                  // process......
                  
          return false;
              }

              @Override
              
          public boolean onSave(Object entity, Serializable id, Object[] state,
                      String[] propertyNames, Type[] types) {
                  logger.info(
          " ### SampleEntityInterceptor.onSave:");
                  // process......
                  
          return false;
              }
          }
          spring配置:
              <!-- 自定義Hibernate Entity Interceptor -->
              
          <bean id="sampleEntityInterceptor" class="org.hook.hibernate.domain.interceptor.SampleEntityInterceptor" />

          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
                  
          <property name="dataSource" ref="dataSource" />
                  
          <property name="namingStrategy">
                      
          <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
                  
          </property>
                  
          <property name="hibernateProperties">
                      
          <props>
                         
          ......
                      
          </props>
                  
          </property>
                  
          <property name="packagesToScan" value="org.hook.hibernate.domain.*"/>
                  
          <property name="entityInterceptor">
                      
          <ref bean="sampleEntityInterceptor"/>
                  
          </property>
              
          </bean>
          SampleEntityInterceptor 中即可對擁有自定義Annotation的entity填充操作日志信息。
          缺點:把日志信息分散到entity屬性中,不利于統一管理和維護。

          方案2:采用hibernate eventlistener實現:
          public class SampleDefaultLoadEventListener extends DefaultLoadEventListener {
              private static final long serialVersionUID = 1L;
              protected Log logger = LogFactory
                      .getLog(SampleDefaultLoadEventListener.class);

              @Override
              public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType)
                      throws HibernateException {
                  super.onLoad(event, loadType);
                  logger.info(" ### SampleDefaultLoadEventListener.onLoad:");
                  // process......
              }
          }
          spring配置:
          <bean id="sampleDefaultLoadEventListener" class="org.hook.hibernate.domain.eventlistener.SampleDefaultLoadEventListener" />

          <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
                  
          <property name="dataSource" ref="dataSource" />
                  
          <property name="namingStrategy">
                      
          <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
                  
          </property>
                  
          <property name="hibernateProperties">
                      
          <props>
                         
          ......
                      
          </props>
                  
          </property>
                  
          <property name="packagesToScan" value="org.hook.hibernate.domain.*"/>
                  
          <property name="entityInterceptor">
                      
          <ref bean="sampleEntityInterceptor"/>
                  
          </property>
                  
          <property name="eventListeners">
                      
          <map>
                          
          <entry key="load">
                              
          <ref bean="sampleDefaultLoadEventListener" />
                          
          </entry>
                      
          </map>
                  
          </property>
              
          </bean>
          通過event.getSession()可獲取到hibernate session.
          另外,需要注意的是,spring提供對sessionfactory的封裝實現中(這里采用的是AnnotationSessionFactoryBean),所繼承的父類在注入eventerlistener時,提供的是個map屬性,所以自定義listener只能采用繼承Default listener的方式實現。
          附上LocalSessionFactoryBean對eventerlistener的初始化代碼:
                      if (this.eventListeners != null) {
                          
          // Register specified Hibernate event listeners.
                          for (Iterator it = this.eventListeners.entrySet().iterator(); it.hasNext();) {
                              Map.Entry entry 
          = (Map.Entry) it.next();
                              Assert.isTrue(entry.getKey() 
          instanceof String, "Event listener key needs to be of type String");
                              String listenerType 
          = (String) entry.getKey();
                              Object listenerObject 
          = entry.getValue();
                              
          if (listenerObject instanceof Collection) {
                                  Collection listeners 
          = (Collection) listenerObject;
                                  EventListeners listenerRegistry 
          = config.getEventListeners();
                                  Object[] listenerArray 
          =
                                          (Object[]) Array.newInstance(listenerRegistry.getListenerClassFor(listenerType), listeners.size());
                                  listenerArray 
          = listeners.toArray(listenerArray);
                                  config.setListeners(listenerType, listenerArray);
                              }
                              
          else {
                                  config.setListener(listenerType, listenerObject);
                              }
                          }
                      }

          posted on 2008-11-18 20:31 鉤子 閱讀(1830) 評論(0)  編輯  收藏 所屬分類: jeeopensources工作筆記
          主站蜘蛛池模板: 湄潭县| 无棣县| 兴文县| 中阳县| 中西区| 桑植县| 凤台县| 汉川市| 思南县| 东乡| 巴东县| 常山县| 凤台县| 钦州市| 丹江口市| 望城县| 霞浦县| 额尔古纳市| 贺兰县| 巴南区| 金门县| 孙吴县| 沙雅县| 郧西县| 巴林右旗| 宁晋县| 梓潼县| 霍林郭勒市| 琼结县| 龙南县| 伊宁县| 新余市| 黄陵县| 柳林县| 宁阳县| 华蓥市| 凯里市| 贺兰县| 贵德县| 南和县| 博客|