隨筆-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 三告習習 閱讀(1038) 評論(0)  編輯  收藏 所屬分類: easyJF-projects
          主站蜘蛛池模板: 青神县| 嘉善县| 揭西县| 天水市| 勐海县| 盐池县| 伽师县| 大石桥市| 宜春市| 浠水县| 宁城县| 万全县| 广南县| 桑日县| 普安县| 叙永县| 靖西县| 兴化市| 融水| 高密市| 盘山县| 吐鲁番市| 台北县| 六安市| 水富县| 积石山| 江川县| 武鸣县| 沙雅县| 南京市| 通江县| 琼中| 阿拉善盟| 耒阳市| 茂名市| 璧山县| 宜州市| 长垣县| 宁都县| 武义县| 巴彦淖尔市|