0

我是 db4o 的新手。我对对象图的持久性有一个大问题。我正在尝试使用 db4o 从旧的持久性组件迁移到新的持久性组件。

在我保留所有对象之前,它的图表如下所示(看一下具有焦点值的 Zrodlo.Metadane.abstrakt 字符串字段)[它来自 eclipse 调试器的视图] 带有代码:

  ObjectContainer db=Db4o.openFile(DB_FILE);
    try {
        db.store(encja);
        db.commit();            
    } finally{
        db.close();         
    }

替代文字

之后,我尝试用代码阅读它:

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”现在为空! 替代文字

我使用 ObjectManager(下图)查看它,abstrakt 字段在那里有非空值!!!相同的值,在第一张图片上。

替代文字

请帮助我 :) 这是我使用 db4o 的第二天。提前致谢!

我附上了一些具有持久类结构的代码:

公共类 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();         
    }       
4

2 回答 2

6

这是一个常见的 db4o 常见问题解答,是 db4o 所谓的“激活”问题。当您从 ObjectContainer 加载对象时,db4o 不会实例化您存储的整个图。默认情况下,对象被实例化为深度 5。您可以将默认配置更改为更高的值,但不建议这样做,因为原则上它会减慢对象加载速度,因为在您通过查询加载对象的任何地方都会使用深度。

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

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

(2) 您可以使用透明激活。db4o 教程和参考文档中有多个章节介绍了如何使用透明激活 (TA)。

于 2010-05-16T18:28:27.573 回答
0

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

于 2010-05-16T15:35:36.020 回答