<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 鉤子 閱讀(1833) 評論(0)  編輯  收藏 所屬分類: jeeopensources工作筆記
    主站蜘蛛池模板: 国产成人无码精品久久久久免费| 久久亚洲精品国产精品婷婷| 一级做a毛片免费视频| 国产成人涩涩涩视频在线观看免费 | 亚洲精品自在线拍| 午夜精品免费在线观看| 亚洲av伊人久久综合密臀性色| 最近2019中文免费字幕在线观看| 亚洲日韩激情无码一区| 免费国产精品视频| 羞羞的视频在线免费观看| 四虎影库久免费视频| 亚洲成亚洲乱码一二三四区软件| 国产人成网在线播放VA免费| 亚洲老妈激情一区二区三区| 精品国产污污免费网站| 亚洲视频在线一区二区三区| 很黄很黄的网站免费的| 亚洲国产精品成人一区| 国产免费播放一区二区| 亚洲va无码va在线va天堂| 久久精品人成免费| 亚洲一区动漫卡通在线播放| 免费无码又爽又刺激毛片| 亚洲成AV人片一区二区密柚| 在线人成精品免费视频| 亚洲一区二区三区免费视频| 免费高清在线影片一区| 一级女性全黄久久生活片免费| 欧洲黑大粗无码免费| 亚洲av成人片在线观看| 中文亚洲AV片不卡在线观看| 999久久久免费精品播放| 亚洲中文无码卡通动漫野外 | 中文字幕免费在线看线人动作大片 | 国产成人精品一区二区三区免费| 亚洲毛片在线免费观看| 日韩一区二区三区免费体验| 精品免费久久久久国产一区| 亚洲国产成人超福利久久精品 | 亚洲国产精品乱码一区二区 |