2010-05-16 42 views
0

我是db4o的新手。對於圖形對象的持久性,我有一個很大的問題。我正嘗試使用db4o從舊的持久性組件遷移到新的組件。db4o對象圖問題

在我peristed所有對象其圖形看起來像下面(看看用聚焦值Zrodlo.Metadane.abstrakt字符串字段)[其從蝕debuger視圖]與代碼:

ObjectContainer db=Db4o.openFile(DB_FILE); 
    try { 
     db.store(encja); 
     db.commit();    
    } finally{ 
     db.close();   
    } 

alt text http://img139.imageshack.us/img139/4609/beforesave.png

在那之後,我試着用代碼來閱讀:

ObjectContainer db = Db4o.openFile((DB_FILE));

try{ 
     Query q = db.query(); 
     q.constrain(EncjaDanych.class); 
     ObjectSet<Object> objectSet = q.execute(); 
     logger.debug("objectSet.size" + objectSet.size()); 
     EncjaDanych encja = (EncjaDanych) objectSet.get(0); 
     logger.debug("ENCJA" + encja.toString()); 
     return encja; 
    }finally{ 
     db.close();   
    }  

,我得到它(圖片下方) - 串場「巴丁格」現在是空! alt text http://img412.imageshack.us/img412/7162/aftersave.png

我使用ObjectManager(下面的圖片)來看看它,並且abstrakt字段有非空值!相同的價值,在第一張照片。

alt text http://img341.imageshack.us/img341/1170/objectmanagerview.png

請幫我:)這是我的第二天使用db4o。提前致謝!

我附上一些碼使用持續類的結構:

公共類EncjaDanych { 地圖mapaIdRepo =新的HashMap(); public Map mapaNazwaRepo = new HashMap(); }

!!!!!!!!更新: 當我試圖只讀Metadane對象(只有一個這樣的對象),這是所有權利 - 這是串場巴丁格可以正確讀取。

 try{ 
     Query q = db.query(); 
     q.constrain(Metadane.class); 
     ObjectSet<Object> objectSet = q.execute(); 
     logger.error("objectSet.size" + objectSet.size()); 
     Metadane meta = (Metadane) objectSet.get(0); 

     logger.debu("Metadane" + meta.toString()); 
     return meta; 
    }finally{ 
     db.close();   
    }  

回答

6

這是一個常見的db4o常見問題,與db4o稱爲「激活」的問題。當您從ObjectContainer加載對象時,db4o不會實例化您存儲的整個圖形。默認情況下,對象的實例化深度爲5.您可以將默認配置更改爲更高的值,但不建議這樣做,因爲它會原則上減緩對象加載速度,因爲無論您在何處使用查詢加載對象,都會使用深度。

兩種可能的方法來解決您的問題:

(1)您可以在您需要的特定深度手工激活對象到所需深度。 db.activate(encja, 10) // 10 is arbitrary

(2)您可以使用透明激活。關於如何在db4o教程和參考文檔中使用透明激活(TA)有多個章節。

+0

謝謝你的幫助!有用! :) – 2010-05-16 18:57:41

0

您沒有在查詢中設置過濾器,因此您正在讀取第一個對象。你確定你在數據庫中沒有以前的對象嗎?

+0

我正在測試它只有一個對象。當然,我正在用記錄器追蹤它。 – 2010-05-16 15:40:06