Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          最近在項(xiàng)目中遇到一個奇怪的問題,在使用Hibernate攔截器捕獲實(shí)體變化并進(jìn)行處理時,發(fā)現(xiàn)其中的onFlushDirty()函數(shù)執(zhí)行了很多次,導(dǎo)致進(jìn)行處理時產(chǎn)生很多重復(fù)數(shù)據(jù)。具體問題如下:
          使用一個類繼承Hibernate的EmptyInterceptor類來對程序中的實(shí)體變化進(jìn)行攔截,并在其中的onFlushDirty()函數(shù)中對捕獲的數(shù)據(jù)進(jìn)行處理,產(chǎn)生對應(yīng)的event數(shù)據(jù)并保存到數(shù)據(jù)庫中。 例如:
          public class EventInterceptor extends EmptyInterceptor {
          public boolean onFlushDirty(
                  Object entity,
                  Serializable id,
                  Object[] currentState,
                  Object[] previousState,
                  String[] propertyNames,
                  Type[] types ) throws CallbackException {

                  if(isAuditable(entity)){//如果該實(shí)體需要被記錄,生成對應(yīng)的event。
                      //此處生成對應(yīng)的event。
                  }
                  return false;
              }

          在程序執(zhí)行后,發(fā)現(xiàn)對應(yīng)一條實(shí)體的變化生成了多條重復(fù)的event記錄,非常不解。
          后來google發(fā)現(xiàn),有人也碰到過對應(yīng)的問題,并在Hibernage論壇中提出過這個問題,鑒定為Hibernate的一個小Bug。
          (原文地址:http://forum.hibernate.org/viewtopic.php?t=940410&highlight=interceptor+onflushdirty)
          解決方法如下:
          將FlushMode改為:FlushMode.COMMIT
          或者也可以提前進(jìn)行flush()
          都可以解決這個問題。

          posted on 2008-05-09 15:59 seal 閱讀(2490) 評論(1)  編輯  收藏 所屬分類: HibernateEJB

          評論

          # re: Interceptor 中onFlushDirty()函數(shù)執(zhí)行多次的問題(Hibernate 的一個小Bug) 2008-05-09 19:34 優(yōu)書齋
          優(yōu)書齋提供大量計算機(jī)書籍下載
          同時歡迎有時間的英語還不錯的朋友加入我們的翻譯團(tuán)隊(duì)
          http://ushuzhai.cn  回復(fù)  更多評論
            

          主站蜘蛛池模板: 普定县| 诏安县| 临邑县| 泾源县| 邻水| 万全县| 蓬莱市| 榆中县| 绩溪县| 开平市| 陆丰市| 定安县| 扶绥县| 文昌市| 来安县| 通榆县| 神木县| 普格县| 吴川市| 五常市| 申扎县| 寿光市| 博客| 佛山市| 汾西县| 壤塘县| 泰宁县| 江川县| 高阳县| 茂名市| 都安| 九江县| 眉山市| 通辽市| 双鸭山市| 芒康县| 东光县| 清苑县| 崇礼县| 红桥区| 新闻|