db4o проблема с графом объектов - PullRequest
0 голосов
/ 16 мая 2010

Я новичок в db4o. У меня большая проблема с сохранением графа объектов. Я пытаюсь перейти со старого компонента персистентности на новый, используя db4o.

До того, как я пропустил все объекты, его график выглядел так, как показано ниже (взгляните на строковое поле Zrodlo.Metadane.abstrakt со сфокусированным значением) [его вид из отладчика eclipse] с кодом:

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

альтернативный текст 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" теперь пусто !!! альтернативный текст http://img412.imageshack.us/img412/7162/aftersave.png

Я смотрю на это, используя ObjectManager (рисунок ниже), и поле abstrakt имеет не нулевое значение !!! То же значение, что на 1-м снимке.

альтернативный текст http://img341.imageshack.us/img341/1170/objectmanagerview.png

Пожалуйста, помогите мне :) Это мой второй день с db4o. Заранее спасибо!

Я прилагаю некоторый код со структурой постоянного класса:

открытый класс EncjaDanych { Map mapaIdRepo = new HashMap (); public Map mapaNazwaRepo = new HashMap (); }

!!!!!!!! ОБНОВЛЕНО: Когда я пытался читать только объект Metadane (был только один такой объект), все было в порядке - это абстракт строкового поля мог быть прочитан правильно.

        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 ]

6 голосов
/ 16 мая 2010

Это часто задаваемые вопросы по db4o, проблема с тем, что db4o называет «активацией». db4o не будет создавать экземпляр всего графика, который вы сохранили при загрузке объекта из ObjectContainer. По умолчанию объекты создаются на глубину 5. Можно изменить конфигурацию по умолчанию на более высокое значение, но это не рекомендуется, поскольку это в принципе замедлит загрузку объекта, поскольку глубина будет использоваться везде, где вы загружаете объект с помощью запроса.

Возможны два подхода к решению вашей проблемы:

(1) Вы можете активировать объект на желаемую глубину вручную, когда вам нужна определенная глубина. db.activate(encja, 10) // 10 is arbitrary

(2) Вы можете работать с прозрачной активацией. В руководстве по db4o и в справочной документации есть несколько глав о том, как использовать прозрачную активацию (TA).

0 голосов
/ 16 мая 2010

Вы не устанавливаете фильтр в своем запросе, поэтому читаете первый объект. Вы уверены, что у вас нет предыдущего объекта в базе данных?

...