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

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

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

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4

    [Tips] Spring+Hibernate之“暴力”update

    Posted on 2009-01-29 16:54 laogao 閱讀(2840) 評論(4)  編輯  收藏 所屬分類: On Java

    先簡單介紹一下問題的語境。

    手頭有個(gè)開發(fā)了3年的Spring+iBATIS應(yīng)用(經(jīng)典三層架構(gòu)),最近嘗試用Hibernate實(shí)現(xiàn)原有SQLMap版的部分CRUD操作。除開混合事務(wù)和其他一些底層配置細(xì)節(jié)(如TransactionAwareDataSource、禁用lazy-load等)之外,最大的一個(gè)"pattern-mismatch"是:Model層和持久層采用了dirty flag機(jī)制,即每次INSERT和UPDATE操作,都會(huì)根據(jù)每個(gè)字段的dirty與否決定是否參加INSERT/UPDATE,而這些dirty flag可以被外部重置,所以業(yè)務(wù)層的代碼,經(jīng)常可以看到類似這樣的pattern:

    1- new一個(gè)model類并setId() (或者在已有的model上重置dirty flag)
    2- set需要update的字段(通常都只是部分字段)
    3- 丟給DAO層去update

    最終的效果是某張表某個(gè)ID的某條記錄的某些字段被更新了,而其他字段不受影響,這就是我在標(biāo)題中提到的所謂"暴力"update,雖不elegant,但卻也簡單實(shí)用,至少很"直接"。

    為了讓Hibernate版的DAO(默認(rèn)除Trasient之外全體字段參加INSERT和UPDATE)繼續(xù)支持這樣的"use-pattern",除了按照Hibernate的習(xí)慣去配置映射和SessionFactory等之外,我們需要做一些額外的工作:

    1- 在BO/Entity類上追加注解
    @org.hibernate.annotations.Entity(dynamicInsert=true,?dynamicUpdate=true)

    2- 實(shí)現(xiàn)org.hibernate.Interceptor接口的findDirty()方法,Hibernate提供了一個(gè)EmptyInterceptor可以作為起點(diǎn),方法簽名如下:
    public?int[]?findDirty(
    ????Object?entity,?
    ????Serializable?id,?
    ????Object[]?currentState,?
    ????Object[]?previousState,?
    ????String[]?propertyNames,?
    ????Type[]?types
    );
    返回的int[]包含所有應(yīng)該被認(rèn)為是dirty的字段索引,返回null表示默認(rèn)處理,傳入的entity是持久對象,字段列表會(huì)通過propertyNames參數(shù)傳給你。

    3- 注入到Spring的Application Context中,類似這樣:
    <bean?id="findDirtyInterceptor"?class="gao.sean.hybrid.interceptor.FindDirtyInterceptor"/>

    <bean?id="sessionFactory"
    ????class
    ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    ????
    ????
    <property?name="entityInterceptor"><ref?bean="findDirtyInterceptor"/></property>
    ????
    </bean>

    在這樣的配置下,業(yè)務(wù)層的代碼就可以繼續(xù)"暴力"update了。

    Feedback

    # re: [Tips] Spring+Hibernate之“暴力”update  回復(fù)  更多評論   

    2009-02-01 12:14 by BeanSoft
    不錯(cuò), 非常的實(shí)用!

    # re: [Tips] Spring+Hibernate之“暴力”update  回復(fù)  更多評論   

    2009-02-05 13:40 by IT公司面試手冊
    好文章

    # re: [Tips] Spring+Hibernate之“暴力”update  回復(fù)  更多評論   

    2009-02-10 00:47 by Evan.Shen
    1、不知樓主是怎么實(shí)現(xiàn)org.hibernate.Interceptor接口的findDirty()方法的
    2、在業(yè)務(wù)層使用能不能給個(gè)例子

    # re: [Tips] Spring+Hibernate之“暴力”update  回復(fù)  更多評論   

    2009-02-10 09:56 by 大胃
    @Evan.Shen
    1- 早先的代碼BO/model類中,已經(jīng)對每個(gè)字段都提供了相應(yīng)的dirty flag,我在findDirty()實(shí)現(xiàn)中,無非是根據(jù)傳入的propertyNames數(shù)組,檢查傳入的entity對象上對應(yīng)的property是否標(biāo)記為dirty,然后返回int[]結(jié)果,沒什么特別的。
    2- 至于業(yè)務(wù)層怎么使用,原文中已經(jīng)有說明:
    # new一個(gè)model類并setId()
    # set需要update的字段
    # 丟給DAO層去update
    主站蜘蛛池模板: 国产成人精品高清免费| 9久热这里只有精品免费| 免费人成激情视频在线观看冫| 日韩在线看片免费人成视频播放| 亚洲综合男人的天堂色婷婷| 最近中文字幕大全免费版在线 | 亚洲综合精品成人| 99久久久国产精品免费蜜臀| 亚洲一区二区女搞男| 一级A毛片免费观看久久精品| 国产婷婷高清在线观看免费| 18禁在线无遮挡免费观看网站| 狠狠色伊人亚洲综合网站色| 四虎成人免费网站在线| 亚洲熟妇av午夜无码不卡 | 久久精品国产亚洲av影院| 成全在线观看免费观看大全| 亚洲日日做天天做日日谢| 亚洲精品亚洲人成在线观看| 日本人成在线视频免费播放| 亚洲av色影在线| 中文字幕免费在线| 亚洲精品在线电影| 国产综合精品久久亚洲| 男人都懂www深夜免费网站| 色窝窝亚洲AV网在线观看| www.亚洲精品| 东北美女野外bbwbbw免费| 伊人久久综在合线亚洲2019| 波多野结衣中文一区二区免费| 中文字幕免费观看全部电影| 亚洲色欲色欱wwW在线| 色婷婷亚洲十月十月色天| 国产亚洲精品无码专区| 97青青草原国产免费观看| A毛片毛片看免费| 黄色免费网址在线观看| 亚洲gv白嫩小受在线观看| 丁香花免费完整高清观看| 羞羞漫画小舞被黄漫免费| 亚洲AV无码一区二区三区牛牛|