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

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

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


    隨筆-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
    主站蜘蛛池模板: 好猛好深好爽好硬免费视频 | 国产一级一片免费播放| 久久久久亚洲精品日久生情 | 麻豆视频免费播放| 亚洲天堂中文资源| 99精品视频免费观看| 777亚洲精品乱码久久久久久 | 成全视频在线观看免费| 亚洲区小说区图片区QVOD| 在线观看黄片免费入口不卡| 我们的2018在线观看免费高清| 亚洲AV成人精品日韩一区18p| 久久久亚洲欧洲日产国码农村| 免费精品一区二区三区第35| 亚洲AV日韩AV永久无码久久| 16女性下面无遮挡免费| 亚洲综合国产成人丁香五月激情| 午夜私人影院免费体验区| 国产亚洲蜜芽精品久久| 国产黄色一级毛片亚洲黄片大全| 亚洲免费观看网站| a级毛片100部免费观看| 国产精品无码素人福利免费| 无遮挡免费一区二区三区| 国产偷v国产偷v亚洲高清| 深夜福利在线免费观看| 成人免费a级毛片| 色拍自拍亚洲综合图区| 成人免费一区二区无码视频| 真人无码作爱免费视频| 67194成是人免费无码| 亚洲视频精品在线观看| 女人18毛片免费观看| 一级做α爱过程免费视频| 久久久久亚洲AV成人无码网站| 五月婷婷免费视频| 四虎精品亚洲一区二区三区 | 色片在线免费观看| 美女扒开屁股让男人桶爽免费| 成年女人午夜毛片免费视频| 亚洲视频一区网站|