隨筆-35  評論-97  文章-0  trackbacks-0

          EasyDBO的實體配置,如果實體存在雙向關聯,并且lazy都設定為false的時候,就會產生堆棧溢出異常。

          為什么會導致堆棧溢出呢?

          比如存在A實體和B實體。

          A實體與B實體存在一對一的雙向關聯,按上面所說的實體關聯配置,A實體就會自動關聯B(從數據庫里根據已設定的外鍵查詢B對象,把查詢結果保存在關聯中,即類型為B的字段),同樣,當A將B對象保存為自己的關聯時,B對象也自動去尋找自己的關聯,上面說了,A與B是雙向關聯,并且lazy=false,所以B也根據自己的外鍵來查詢A,將查詢結果A對象保存為自己的關聯,然后A又查詢自己的關聯...一直循環下去,最終,發生了堆棧溢出。

          是否需要在查詢一次關聯后將關聯的lazy重設為true呢?我試了一下,在實體在第一次尋找完自己的關聯后將關聯的屬性設為true,就可以避免了堆棧溢出。

          在EasyDBO上做的代碼修改是:

          在EasyJDB的private void dbo2obj(DBObject dbo, Object obj)方法中,

           

              private void dbo2obj(DBObject dbo, Object obj)
              
          {
                  
          if(dbo != null)
                  
          {
                      Map map 
          = dbo.getValue();
                      DBTable table 
          = findTable(obj.getClass());
                      
          if(table == null)
                      
          {
                          table 
          = dbo.getTable();
                      }

                      
          // this.setAutoCommit(false);
                      BeanWrapper wrapper = new BeanWrapper(obj);
                      java.util.Iterator it 
          = table.getAllFields().entrySet().iterator();
                      
          while(it.hasNext())
                      
          {
                          Map.Entry en 
          = (Map.Entry)it.next();
                          DBField field 
          = (DBField)en.getValue();
                          String popertyName 
          = (String)en.getKey();

                          
          try
                          
          {
                              
          if(ClassField.class.isAssignableFrom(field.getClass()))
                              
          {
                                  
          if(logger.isDebugEnabled())
                                      logger.debug(field.getClass());

                                  field.setLazy(
          true);//加載一次后,將lazy設定為true。否則會出現堆棧溢出錯誤!//這里添加了一句
                                  if(field.getClass() == OneToOneField.class && !field.isLazy())
                                  
          {
                                      
          // 過濾掉OneToOne中的null屬性
                                      wrapper.setPropertyValue(popertyName, ((ClassField)field).loadValue(dbo, this));
                                  }

              

           

          感覺上,根據文檔說明,lazy設定為true,但是沒有起到什么作用哦。很奇怪。

          我在上面的

          field.setLazy(true);這里添加了一句

          前面又添加了一句:

          if(field.isLazy()){
                 continue;
                }
          感覺上不是很合理,不管了,先用著,查正原因再做修正。

          posted on 2007-07-02 14:02 三告習習 閱讀(1032) 評論(0)  編輯  收藏 所屬分類: easyJF-projects
          主站蜘蛛池模板: 武乡县| 绥阳县| 镇远县| 墨竹工卡县| 壤塘县| 奉贤区| 贺州市| 常宁市| 铜梁县| 岑溪市| 大埔县| 神农架林区| 普安县| 新巴尔虎右旗| 富平县| 丰顺县| 依安县| 赣榆县| 河曲县| 昌都县| 横峰县| 睢宁县| 德昌县| 安丘市| 鄂伦春自治旗| 中超| 石棉县| 修文县| 永宁县| 阿克苏市| 文成县| 巴彦淖尔市| 峨眉山市| 瑞安市| 惠来县| 隆回县| 府谷县| 灵川县| 华蓥市| 广宁县| 密云县|