This topic applies to Java version only
Enumerated types were brought into Java with the JDK 1.5 release. In fact they represent a class with static fields similar to the one reviewed in the Static fields paragraph.
01/* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com */ 02
03
package com.db4odoc.f1.enums; 04
05
06
public enum Qualification { 07
08
WINNER("WINNER"), 09
PROFESSIONAL("PROFESSIONAL"), 10
TRAINEE("TRAINEE"); 11
12
private String qualification; 13
14
private Qualification(String qualification) { 15
this.qualification = qualification; 16
} 17
18
public void testChange(String qualification){ 19
this.qualification = qualification; 20
} 21
22
public String toString() { 23
return qualification; 24
} 25
}
db4o takes care about storing enumeration objects automatically without any additional settings:
01public static void setPilots(){ 02
new File(Util.YAPFILENAME).delete(); 03
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04
try { 05
db.set(new Pilot("Michael Schumacher",Qualification.WINNER)); 06
db.set(new Pilot("Rubens Barrichello",Qualification.PROFESSIONAL)); 07
} finally { 08
db.close(); 09
} 10
}
01public static void checkPilots(){ 02
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 03
try { 04
ObjectSet result = db.query(Pilot.class); 05
System.out.println("Saved pilots: " + result.size()); 06
for(int x = 0; x < result.size(); x++){ 07
Pilot pilot = (Pilot )result.get(x); 08
if (pilot.getQualification() == Qualification.WINNER){ 09
System.out.println("Winner pilot: " + pilot); 10
} else if (pilot.getQualification() == Qualification.PROFESSIONAL){ 11
System.out.println("Professional pilot: " + pilot); 12
} else { 13
System.out.println("Uncategorized pilot: " + pilot); 14
} 15
} 16
} finally { 17
db.close(); 18
} 19
}
Another specific feature of enums in db4o: deletion is not possible:
01public static void deletePilots(){ 02
System.out.println("Qualification enum before delete Pilots"); 03
printQualification(); 04
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 05
db.ext().configure() .objectClass(Pilot.class).objectField("qualification").cascadeOnDelete(true); 06
07
try { 08
ObjectSet result = db.query(Pilot.class); 09
for(int x = 0; x < result.size(); x++){ 10
Pilot pilot = (Pilot )result.get(x); 11
db.delete(pilot); 12
} 13
} finally { 14
db.close(); 15
} 16
System.out.println("Qualification enum after delete Pilots"); 17
printQualification(); 18
}
01public static void checkPilots(){ 02
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 03
try { 04
ObjectSet result = db.query(Pilot.class); 05
System.out.println("Saved pilots: " + result.size()); 06
for(int x = 0; x < result.size(); x++){ 07
Pilot pilot = (Pilot )result.get(x); 08
if (pilot.getQualification() == Qualification.WINNER){ 09
System.out.println("Winner pilot: " + pilot); 10
} else if (pilot.getQualification() == Qualification.PROFESSIONAL){ 11
System.out.println("Professional pilot: " + pilot); 12
} else { 13
System.out.println("Uncategorized pilot: " + pilot); 14
} 15
} 16
} finally { 17
db.close(); 18
} 19
}
Deletion of references does not automatically delete the enum. Even explicit deletion does not work:
01public static void deleteQualification(){ 02
System.out.println("Explicit delete of Qualification enum"); 03
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04
db.ext().configure() .objectClass(Qualification.class).cascadeOnDelete(true); 05
try { 06
ObjectSet result = db.query(Qualification.class); 07
for(int x = 0; x < result.size(); x++){ 08
Qualification pq = (Qualification)result.get(x); 09
db.delete(pq); 10
} 11
} finally { 12
db.close(); 13
} 14
printQualification(); 15
}
Enum update works in the same way as for normal static objects - updated enum should be explicitly saved to database (#set(enum)).
01public static void updateQualification(){ 02
System.out.println("Updating WINNER qualification constant"); 03
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04
try { 05
Query query = db.query(); 06
query.constrain(Qualification.class); 07
query.descend("qualification").constrain("WINNER"); 08
ObjectSet result = query.execute(); 09
for(int x = 0; x < result.size(); x++){ 10
Qualification qualification = (Qualification)result.get(x); 11
qualification.testChange("WINNER2006"); 12
db.set(qualification); 13
} 14
} finally { 15
db.close(); 16
} 17
printQualification(); 18
}
You can use either build-in Java enums or write your own. Db4o will take care of keeping object references unique and database file as small as possible.