2013-11-29 25 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