<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工作筆記
    主站蜘蛛池模板: 亚洲五月综合网色九月色| 国产亚洲精品拍拍拍拍拍| 亚洲综合久久久久久中文字幕| 青青操视频在线免费观看| 亚洲色大成网站WWW久久九九| 一级毛片免费不卡| 亚洲无人区一区二区三区| 中文字幕av无码不卡免费 | 国产午夜精品理论片免费观看| 亚洲一本大道无码av天堂| 国产一二三四区乱码免费| 亚洲av日韩av无码| 99久久99这里只有免费费精品| 亚洲资源最新版在线观看| 在线观看人成网站深夜免费| 国产成人va亚洲电影| 久久亚洲国产精品123区| 久久国产免费观看精品| 亚洲精品偷拍无码不卡av| 无码日韩人妻av一区免费| 国产精品亚洲AV三区| 精品亚洲成α人无码成α在线观看| 在线观看黄片免费入口不卡| 亚洲a一级免费视频| 免费毛片在线看片免费丝瓜视频| 久久人午夜亚洲精品无码区| 亚洲色偷偷偷鲁综合| 120秒男女动态视频免费| 亚洲熟妇无码AV| 国产亚洲精品福利在线无卡一 | 精品亚洲AV无码一区二区三区| 午夜小视频免费观看| 丁香花在线观看免费观看图片| 亚洲日本中文字幕| 日韩电影免费在线观看视频| 一区二区三区免费视频观看| 67pao强力打造67194在线午夜亚洲 | 免费可以在线看A∨网站| 黄色三级三级三级免费看| 久久久久亚洲AV成人无码网站| 夜夜爽免费888视频|