Problema con DB4Objects

f?x
22 de Julio del 2005
Hola a todos,

Estoy intentando utilizar DB4Objects para lamacenar objetos de tipo Fact (hechos del motor de reglas de Jess). Los intento almacenar directamente en la BD y no podía recuperarlos, por lo que decidí utlizar una clase que los envolviera y que simplemente almacenara el hecho en un campo y el id de éste. El código es que hace esto es el suiguiente:

public class Db4oTest {

private String filename;

private static Rete engine;

public Db4oTest() {
filename = "c:/factcontainer.yap";
}

public static void main(String[] args) {
Db4oTest tester = new Db4oTest();
engine = new Rete();
// Añado plantillas
try {
engine.executeCommand("(batch defaulttemplates.clp)");
} catch (JessException e) {
System.err.println("Error añadiendo plantillas");
e.printStackTrace();
}

tester.createTestData();

tester.easyQuery();


}

public static void listResult (ObjectSet result) {
System.out.println(result.size());
while (result.hasNext()) {
System.out.println(((FactPersitent) result.next()).getFact());
}
}

public void easyQuery(){

// Open database
ObjectContainer db = Db4o.openFile(filename);
FactPersitent proto = new FactPersitent(null,new Integer(3));
ObjectSet result= db.get(proto);
listResult(result);

result.reset();

// Close database
db.close();



}


/**
* creates test objects and stores them in new database file
*/
private void createTestData() {
System.out.println("Setting up some new test data");

// Añado hechos
Fact f1 = null, f2 = null, f3 = null, f4 = null;

// Open a new database
new File(filename).delete();
ObjectContainer db = Db4o.openFile(filename);

System.out.println("Añado los hechos");

//Hecho que representa a los números enteros
try {
f1 = new Fact("default-type", engine);

f1.setSlotValue("name", new Value("INTEGER", RU.STRING));
engine.assertFact(f1);

//Hecho que representa a los números reales
f2 = new Fact("default-type", engine);
f2.setSlotValue("name", new Value("FLOAT", RU.STRING));
engine.assertFact(f2);

//Hecho que representa a los números naturales
f3 = new Fact("default-type", engine);
f3.setSlotValue("name", new Value("NATURAL", RU.STRING));
engine.assertFact(f3);

// Hecho que representa a las cadenas de caracteres
f4 = new Fact("default-type", engine);
f4.setSlotValue("name", new Value("STRING", RU.STRING));
engine.assertFact(f4);
} catch (JessException e1) {
System.err.println("Error afirmando hechos");
e1.printStackTrace();
}

FactPersitent fp1=null,fp2 = null,fp3= null,fp4=null;

fp1=new FactPersitent(f1,new Integer(f1.getFactId()));
fp2 = new FactPersitent(f2,new Integer(f2.getFactId()));
fp3 = new FactPersitent(f3,new Integer(f3.getFactId()));
fp4 = new FactPersitent(f4,new Integer(f4.getFactId()));

// Almaceno hechos
db.set(fp1);
db.set(fp2);
db.set(fp3);
db.set(fp4);

// Close database
db.close();

}
Las referencias a la clase FactPersitent son a la clase que antes he comentado y que simplemente elnvuelve al hecho. De este modo si se almacenan, pero cuando intento recuperarlos y utilizo getFact() (que simplemente devuelve el campo que contiene el hecho) me devuelve null. Si alguien tiene ganas de echarle un vistazo al código para ver lo que está mal le estaria muy agradecido. Si quiere el código completo (solo una clase más) para ejecutarlo, yo se lo mando encantado. Un saludo y muchas gracias,

Félix.