我是db4o的新手.持久的对象图存在一个大问题.我正在尝试使用db4o从旧的persistance组件迁移到new.
在我对所有对象进行操作之前,它的图形如下所示(看看具有聚焦值的Zrodlo.Metadane.abstrakt字符串字段)[来自eclipse debuger的视图],代码如下:
Run Code Online (Sandbox Code Playgroud)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();
}
Run Code Online (Sandbox Code Playgroud)
我得到了它(如下图所示) - 字符串字段"abstrakt"现在为空! alt text http://img412.imageshack.us/img412/7162/aftersave.png
我使用ObjectManager(下面的图片)看看它,abstrakt字段在那里有非null值!相同的值,即第1张图片上的值.
alt text http://img341.imageshack.us/img341/1170/objectmanagerview.png
请帮帮我:)这是我与db4o的第二天.提前致谢!
我附加了一些持久化类的结构代码:
公共类EncjaDanych {Map mapaIdRepo = new HashMap(); 公共地图mapaNazwaRepo = new HashMap(); }
!!!!!!!!更新:当我试图只读取Metadane对象(只有一个这样的对象)时,它没问题 - 它的字符串字段abstrakt可以正确读取.
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();
}
Run Code Online (Sandbox Code Playgroud)
这是一个常见的db4o FAQ,这是db4o称之为"激活"的问题.从ObjectContainer加载对象时,db4o不会实例化存储的整个图形.默认情况下,对象实例化深度5.您可以更改默认配置为更高的值,但不推荐,因为它会在原则上放慢物投入,因为深度将使用随处可见装载对象与查询.
有两种方法可以解决您的问题:
(1)当您需要特定深度时,可以手动将对象激活到所需深度.
db.activate(encja, 10) // 10 is arbitrary
(2)您可以使用透明激活.有关如何在db4o教程和参考文档中使用透明激活(TA)的章节.