2010-05-16 4 views
0

Je suis un nouveau à db4o. J'ai un gros problème avec la persistance d'un graphique d'objets. J'essaie de migrer de l'ancien composant de persistance vers new, en utilisant db4o.db4o problème avec le graphique des objets

Avant peristed tous les objets de son graphe ressemblait ci-dessous (Jetez un oeil à champ de chaîne Zrodlo.Metadane.abstrakt avec la valeur ciblée) [son point de vue de debuger éclipse] avec un code:

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

Après cela, j'ai essayé de le lire avec un code:

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

et je l'ai eu (photo ci-dessous) - champ de chaîne "Abstrakt" est null maintenant !!! Je l'examine en utilisant ObjectManager (image ci-dessous) et le champ abstrakt n'a pas de valeur nulle ici !!! La même valeur, celle sur la 1ère photo.

alt text http://img341.imageshack.us/img341/1170/objectmanagerview.png

S'il vous plaît aidez-moi :) Il est mon deuxième jour avec db4o. Merci d'avance!

Je joins un code avec la structure de classe persistante:

EncjaDanych public class { Plan mapaIdRepo = new HashMap(); public Map mapaNazwaRepo = new HashMap(); }

!!!!!!!! MISE À JOUR: Quand j'ai essayé de lire seul objet Metadane (il n'y avait qu'un tel objet), il est tout droit - c'est champ chaîne abstrakt pourrait être lu correctement.

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

Répondre

6

Ceci est une FAQ db4o courante, un problème avec ce que db4o appelle "activation". db4o n'instanciera pas le graphique entier que vous avez stocké lorsque vous chargez un objet à partir d'un ObjectContainer. Par défaut, les objets sont instanciés à la profondeur 5. Vous pouvez changer la configuration par défaut à une valeur plus élevée, mais cela n'est pas recommandé car cela ralentira le chargement des objets car la profondeur sera utilisée partout où vous chargez un objet avec une requête.

Deux approches sont possibles pour résoudre votre problème:

(1) Vous pouvez activer un objet à une profondeur désirée à la main lorsque vous avez besoin d'une profondeur spécifique. db.activate(encja, 10) // 10 is arbitrary

(2) Vous pouvez travailler avec l'activation transparente. Il existe plusieurs chapitres sur l'utilisation de l'activation transparente (TA) dans le didacticiel db4o et dans la documentation de référence.

+0

Merci pour votre aide! Ça marche! :) –

0

Vous ne définissez pas de filtre dans votre requête afin de lire le premier objet. Êtes-vous sûr de n'avoir pas d'objet précédent dans la base de données?

+0

Je le teste pour un seul objet. Pour sûr, je suis le traçage par un enregistreur. –

Questions connexes