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 - 2007 db4objects Inc. http://www.db4o.com */ 02
03
package com.db4odoc.enums; 04
05
public enum Qualification { 06
07
WINNER("WINNER"), 08
PROFESSIONAL("PROFESSIONAL"), 09
TRAINEE("TRAINEE"); 10
11
private String qualification; 12
13
private Qualification(String qualification) { 14
this.qualification = qualification; 15
} 16
17
public void testChange(String qualification){ 18
this.qualification = qualification; 19
} 20
21
public String toString() { 22
return qualification; 23
} 24
}
db4o takes care about storing enumeration objects automatically without any additional settings:
01private static void setPilots(){ 02
new File(DB4O_FILE_NAME).delete(); 03
ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 04
try { 05
container.set(new Pilot("Michael Schumacher",Qualification.WINNER)); 06
container.set(new Pilot("Rubens Barrichello",Qualification.PROFESSIONAL)); 07
} finally { 08
container.close(); 09
} 10
}
01private static void checkPilots(){ 02
ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 03
try { 04
ObjectSet result = container.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
container.close(); 18
} 19
}
Another specific feature of enums in db4o: deletion is not possible:
01private static void deletePilots(){ 02
System.out.println("Qualification enum before delete Pilots"); 03
printQualification(); 04
Configuration configuration = Db4o.newConfiguration(); 05
configuration .objectClass(Pilot.class).objectField("qualification").cascadeOnDelete(true); 06
ObjectContainer container=Db4o.openFile(configuration, DB4O_FILE_NAME); 07
08
try { 09
ObjectSet result = container.query(Pilot.class); 10
for(int x = 0; x < result.size(); x++){ 11
Pilot pilot = (Pilot )result.get(x); 12
container.delete(pilot); 13
} 14
} finally { 15
container.close(); 16
} 17
System.out.println("Qualification enum after delete Pilots"); 18
printQualification(); 19
}
01private static void checkPilots(){ 02
ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 03
try { 04
ObjectSet result = container.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
container.close(); 18
} 19
}
Deletion of references does not automatically delete the enum. Even explicit deletion does not work:
01private static void deleteQualification(){ 02
System.out.println("Explicit delete of Qualification enum"); 03
Configuration configuration = Db4o.newConfiguration(); 04
configuration.objectClass(Qualification.class).cascadeOnDelete(true); 05
ObjectContainer container=Db4o.openFile(configuration, DB4O_FILE_NAME); 06
try { 07
ObjectSet result = container.query(Qualification.class); 08
for(int x = 0; x < result.size(); x++){ 09
Qualification pq = (Qualification)result.get(x); 10
container.delete(pq); 11
} 12
} finally { 13
container.close(); 14
} 15
printQualification(); 16
}
Enum update works in the same way as for normal static objects - updated enum should be explicitly saved to database (#set(enum)).
01private static void updateQualification(){ 02
System.out.println("Updating WINNER qualification constant"); 03
ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 04
try { 05
Query query = container.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
container.set(qualification); 13
} 14
} finally { 15
container.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.