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
          回顧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工作筆記
          主站蜘蛛池模板: 托克逊县| 鹿泉市| 雷州市| 高雄市| 漠河县| 井陉县| 盈江县| 汤阴县| 东至县| 柘城县| 泾源县| 邹平县| 姚安县| 平塘县| 澎湖县| 宁陕县| 康马县| 绥化市| 辽阳市| 墨玉县| 酉阳| 德昌县| 仙桃市| 仁怀市| 宁国市| 长治市| 龙陵县| 义马市| 宜章县| 敦煌市| 宝应县| 赫章县| 扎鲁特旗| 临清市| 肃南| 慈溪市| 北票市| 淳安县| 凤山县| 汨罗市| 樟树市|