隨筆-35  評(píng)論-97  文章-0  trackbacks-0

          EasyDBO的實(shí)體配置,如果實(shí)體存在雙向關(guān)聯(lián),并且lazy都設(shè)定為false的時(shí)候,就會(huì)產(chǎn)生堆棧溢出異常。

          為什么會(huì)導(dǎo)致堆棧溢出呢?

          比如存在A實(shí)體和B實(shí)體。

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

          是否需要在查詢一次關(guān)聯(lián)后將關(guān)聯(lián)的lazy重設(shè)為true呢?我試了一下,在實(shí)體在第一次尋找完自己的關(guān)聯(lián)后將關(guān)聯(lián)的屬性設(shè)為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設(shè)定為true。否則會(huì)出現(xiàn)堆棧溢出錯(cuò)誤!//這里添加了一句
                                  if(field.getClass() == OneToOneField.class && !field.isLazy())
                                  
          {
                                      
          // 過濾掉OneToOne中的null屬性
                                      wrapper.setPropertyValue(popertyName, ((ClassField)field).loadValue(dbo, this));
                                  }

              

           

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

          我在上面的

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

          前面又添加了一句:

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

          posted on 2007-07-02 14:02 三告習(xí)習(xí) 閱讀(1044) 評(píng)論(0)  編輯  收藏 所屬分類: easyJF-projects
          主站蜘蛛池模板: 理塘县| 武清区| 峨眉山市| 读书| 平安县| 永定县| 锡林郭勒盟| 噶尔县| 霞浦县| 当阳市| 日照市| 乌什县| 博乐市| 永川市| 正镶白旗| 怀化市| 阳山县| 安阳市| 武汉市| 孙吴县| 西畴县| 禹城市| 嘉禾县| 石楼县| 石泉县| 成武县| 宽城| 新泰市| 建水县| 饶河县| 隆昌县| 富锦市| 邻水| 班戈县| 固安县| 怀仁县| 衢州市| 响水县| 安福县| 五大连池市| 普兰店市|