2013-11-29 39 views
0

我想弄清楚調整我的db4o實例會發生什麼,但這真的讓我發瘋:它對我來說根本沒有意義。db4o:嚴重的問題和不連貫

本質上,我創建了兩個對象,並將第一個對象存儲在第二個ArrayList中。然後我想從整個數據庫和最初存儲的列表中刪除第一個對象。

這是我正在運行的操作的基本列表。

User user = new User("user"); 
Device device = new Device("device"); 
objectContainer.ext().store(user,5); // object storing depth 
objectContainer.commit(); 

objectContainer.delete(device); 

//objectContainer.close(); 
//objectContainer = new ... 

此時如果我關閉和我重新打開的ObjectContainer用戶DEVICELIST包含一個空對象,而如果我不關閉容器(作爲普通運行的應用程序通常應避免)設備對象是靜止在用戶對象內部,而不在整個數據庫中。

我只想要將對象從列表和數據庫中刪除,但沒有任何空對象就位。這可能嗎??我已經嘗試了許多調整配置(弱引用,激活,約束......),但沒有取得任何成功。

回答

1

爲什麼重新打開後仍有對象仍在列表中,但之前沒有?

  • 如果您刪除一個對象,它將在數據庫中被刪除。
  • 但是,db4o不會修改任何內存內容。因此,在重新開放之前,該集合是該集合的內存表示中的「舊」。它仍然包含對該對象的引用。 db4o不會刪除它。
  • 重新打開後:集合從數據庫加載。由於該對象已從數據庫中刪除,因此將使用不再存在的對象的「空」參考。

db4o不會從內存對象中'神奇地''刪除'對象。你必須確保對象模型有一個一致的狀態,像任何其他內存對象圖\

這裏有一些提示:http://community.versant.com/documentation/reference/db4o-8.1/net/reference/Content/best_practises/managing_relations.htm

+0

顯然不會被刪除或者從數據庫這個例子中表現出來; – giulio

+0

該對象只有在不能從緩存中的任何其他對象進行訪問時纔會被刪除。所以你必須從每個使用它的地方刪除對象,才能真正刪除它。 – Galigator

+0

我重新創建了DBManager,所以現在關係是手動維護的。我認爲,由於緩存,避免這種情況是不可能的。即使試圖直接讀取數據庫也是不可能的,因爲對象保存在java堆中,並在重新啓動後立即刪除。 – giulio