我是db4o的新手。持久的对象图存在一个大问题。我正在尝试使用db4o从旧的persistance组件迁移到new。
在我对所有对象进行操作之前,它的图形如下所示(看一下具有聚焦值的Zrodlo.Metadane.abstrakt字符串字段)[来自eclipse 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();
}
我得到了它(如下图所示) - 字符串字段“abstrakt”现在为空! alt text http://img412.imageshack.us/img412/7162/aftersave.png
我使用ObjectManager(下面的图片)看看它,abstrakt字段在那里有非空值!相同的值,即第1张图片。
alt text http://img341.imageshack.us/img341/1170/objectmanagerview.png
请帮帮我:)这是我与db4o的第二天。提前谢谢!
我附加了一些带有持久化类结构的代码:
public class EncjaDanych { 映射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();
}
答案 0 :(得分:6)
这是一个常见的db4o FAQ,这是db4o称之为“激活”的问题。从ObjectContainer加载对象时,db4o不会实例化存储的整个图形。默认情况下,对象被实例化为深度5.您可以将默认配置更改为更高的值,但不推荐这样做,因为它原则上会减慢对象加载速度,因为深度将在您使用查询加载对象的任何位置使用。
有两种方法可以解决您的问题:
(1)当您需要特定深度时,可以手动将对象激活到所需深度。
db.activate(encja, 10) // 10 is arbitrary
(2)您可以使用透明激活。有关如何在db4o教程和参考文档中使用透明激活(TA)的章节。
答案 1 :(得分:0)
您没有在查询中设置过滤器,因此您正在阅读第一个对象。您确定数据库中没有先前的对象吗?