db4o问题与对象图

时间:2010-05-16 15:30:55

标签: db4o

我是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();         
    }       

2 个答案:

答案 0 :(得分:6)

这是一个常见的db4o FAQ,这是db4o称之为“激活”的问题。从ObjectContainer加载对象时,db4o不会实例化存储的整个图形。默认情况下,对象被实例化为深度5.您可以将默认配置更改为更高的值,但不推荐这样做,因为它原则上会减慢对象加载速度,因为深度将在您使用查询加载对象的任何位置使用。

有两种方法可以解决您的问题:

(1)当您需要特定深度时,可以手动将对象激活到所需深度。 db.activate(encja, 10) // 10 is arbitrary

(2)您可以使用透明激活。有关如何在db4o教程和参考文档中使用透明激活(TA)的章节。

答案 1 :(得分:0)

您没有在查询中设置过滤器,因此您正在阅读第一个对象。您确定数据库中没有先前的对象吗?