请教db4o delete对象后,关联对象未删除

请教各位兄弟,小弟在使用db4o 存储一个对象CacheV2Element,有3个属性。


public class CacheV2Element {
private String key;
private KeyedCollection kcoll;
//milliseconds
private long age;
。。。
}

其中的KeyedCollection 是个复杂些的对象。KeyedCollection 里面可以放任何对象。也可以放KeyedCollection 。在我删除一个CacheV2Element后,发现KeyedCollection 对象并没有删除掉。


public class KeyedCollection extends DataElement implements Map {

private Map dataElements;

private List dataNames;

public KeyedCollection() {
super();
dataElements = new HashMap();
this.dataNames = new ArrayList();
}
..........
}

删除和更新的时候,我加了:


this.odb.ext().refresh(element, 5);
这个5,我不确定对象的深度为多少???
/**
* 删除缓存中的对象,并且顺带删除过期的对象
* */

public void delete(final String journalNo) {
try{
this.odb=Db4oCP.getODBConnection();
CacheV2Element element=this.queryCacheV2Element(journalNo);
if(element!=null){

this.odb.delete(element);
this.odb.ext().refresh(element, 5);
this.odb.commit();
Trace.logDebug(Trace.COMPONENT_JDBC,
"SessionCacheV2 delete key="+journalNo);
}
//call delete all.
deleteGarbage();
}catch(Exception e){
e.printStackTrace();
}finally{
Db4oCP.release(this.odb);
}
}

4.Structed Object

如果一个对象中不仅仅有常见的java类型还包含其他的对象,那么在modify 被包含的对象的时候,就会出现一个问题。如果我更新了这些被包含的对象,那么在update delete 的时候,他们会不会被操作到?db4o中 提供了一个 depth的概念。所有object 的默认的update depth为1,这就意味着该object 中的primitive 和 string members 能被update,其他类型的对象将不被update。 同样对应delete 如果想实现 对象中的递归删除, 那同样需要利用db4o中的 delete depth


这是update depth:
[updatePilotSeparateSessionsImprovedPart1]
Db4o.configure().objectClass("com.db4o.f1.chapter2.Car").cascadeOnUpdate(true);

这是delete depth:
[deleteDeepPart1]
Db4o.configure().objectClass("com.db4o.f1.chapter2.Car")
.cascadeOnDelete(true);

Again: Note that all configuration must take place before the ObjectContainer is opened.

其实这里还没有结束,对于delete 会出现这么一个问题,当我通过 delet depth 将一个instance 删除了,他里面包含的某个其他类型的object instance 也被删除了,但是这个
对象还在被其他对象引用,那这个问题怎么办? 现在db4o 还没有解决方法。我们现在只能
小心操作delete。


哈哈,傻了吧?指望通过配置文件实现复杂的业务对象关联关系管理?
我认为这是不可能的!
即使开发实施人员能够配出来,用户自己能实现吗?如果不能,这样的软件对用户有什么吸引力呢?