<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 首頁 新隨筆 聯(lián)系 聚合 管理
      19 Posts :: 10 Stories :: 25 Comments :: 0 Trackbacks
    回顧hibernate refernce,在自定義hibernate intecerptor,events listencer模塊,假設(shè)了個(gè)實(shí)現(xiàn)針對(duì)某個(gè)對(duì)象數(shù)據(jù)操作,要求實(shí)現(xiàn)操作日志的記錄的功能需求,以下是實(shí)現(xiàn)方案的記錄:
    方案1:采用hibernate interceptor實(shí)現(xiàn):
    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 中即可對(duì)擁有自定義Annotation的entity填充操作日志信息。
    缺點(diǎn):把日志信息分散到entity屬性中,不利于統(tǒng)一管理和維護(hù)。

    方案2:采用hibernate eventlistener實(shí)現(xiàn):
    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提供對(duì)sessionfactory的封裝實(shí)現(xiàn)中(這里采用的是AnnotationSessionFactoryBean),所繼承的父類在注入eventerlistener時(shí),提供的是個(gè)map屬性,所以自定義listener只能采用繼承Default listener的方式實(shí)現(xiàn)。
    附上LocalSessionFactoryBean對(duì)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 鉤子 閱讀(1822) 評(píng)論(0)  編輯  收藏 所屬分類: jeeopensources工作筆記
    主站蜘蛛池模板: 久久这里只精品国产免费10| 免费一本色道久久一区| 99人中文字幕亚洲区| 亚洲第一成年免费网站| 免费看一级高潮毛片| 久久久影院亚洲精品| 97人伦色伦成人免费视频| 一级**爱片免费视频| 亚洲黄色在线网站| 四虎成人精品在永久免费| 精品国产一区二区三区免费| 亚洲国产无线乱码在线观看| 久久青草亚洲AV无码麻豆| 国产极品美女高潮抽搐免费网站| 无码人妻丰满熟妇区免费| 亚洲.国产.欧美一区二区三区| 亚洲国产AV无码专区亚洲AV| 日韩a在线观看免费观看| 国产偷伦视频免费观看| 精品久久亚洲一级α| 亚洲欧洲日产专区| 狠狠亚洲狠狠欧洲2019| 最近最新中文字幕完整版免费高清| a在线视频免费观看| 亚洲av永久无码一区二区三区 | 亚洲国产老鸭窝一区二区三区| 日韩免费观看的一级毛片| 久久国产色AV免费看| 亚欧乱色国产精品免费视频| 亚洲 欧洲 视频 伦小说| 亚洲第一视频网站| 亚洲精品成人a在线观看| 成人免费视频小说| 最近中文字幕无免费| 国产一级a毛一级a看免费人娇| 精品韩国亚洲av无码不卡区| 亚洲一区二区三区高清视频| 内射少妇36P亚洲区| 国产精品亚洲精品日韩已满| 无码不卡亚洲成?人片| 成人毛片18女人毛片免费|