<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 鉤子 閱讀(1821) 評論(0)  編輯  收藏 所屬分類: jeeopensources工作筆記
    主站蜘蛛池模板: 亚洲伊人久久大香线蕉AV| 中文字幕亚洲情99在线| 九九精品免费视频| 中文字幕永久免费| 亚洲精品无码高潮喷水A片软| 亚洲AV无码久久精品狠狠爱浪潮| 97国产在线公开免费观看| 国产精品玖玖美女张开腿让男人桶爽免费看| 精品无码一区二区三区亚洲桃色| 亚洲成a人一区二区三区| 在线不卡免费视频| 成人女人A级毛片免费软件| 91在线手机精品免费观看| 成人无码精品1区2区3区免费看 | 9i9精品国产免费久久| 亚洲色一区二区三区四区| 亚洲va在线va天堂成人| 亚洲av专区无码观看精品天堂| 久久亚洲AV成人出白浆无码国产 | 国产精品1024在线永久免费| 乱人伦中文视频在线观看免费| 国产亚洲午夜精品| 一级特黄aaa大片免费看| 成人片黄网站色大片免费观看cn | 久久久婷婷五月亚洲97号色| 久久亚洲sm情趣捆绑调教| 亚洲伊人久久大香线蕉啊| 亚洲日韩亚洲另类激情文学| 亚洲AV无码男人的天堂| a高清免费毛片久久| 一级毛片不卡片免费观看| 黄色成人网站免费无码av| 免费少妇a级毛片| 亚洲第一福利视频| 亚洲色大成网站www| 色老头综合免费视频| 亚洲免费福利视频| 亚洲av成人一区二区三区在线观看 | 亚洲xxxxxx| 久久99热精品免费观看动漫| 天天摸天天操免费播放小视频|