16. IDs


The db4o team recommends, not to use object IDs where this is not necessary. db4o keeps track of object identities in a transparent way, by identifying "known" objects on updates. The reference system also makes sure that every persistent object is instantiated only once, when a graph of objects is retrieved from the database, no matter which access path is chosen. If an object is accessed by multiple queries or by multiple navigation access paths, db4o will always return the one single object, helping you to put your object graph together exactly the same way as it was when it was stored, without having to use IDs.

The use of IDs does make sense when object and database are disconnected, for instance in stateless applications.

db4o provides two types of ID systems.


    16.1. Internal IDs

    The internal db4o ID is a physical pointer into the database with only one indirection in the file to the actual object so it is the fastest external access to an object db4o provides. The internal ID of an object is available with
    objectContainer.ext().getID(object);

    To get an object for an internal ID use
    objectContainer.ext().getByID(id);

    Note that #getByID() does not activate objects. If you want to work with objects that you get with #getByID(), your code would have to make sure the object is activated by calling
    objectContainer.activate(object, depth);

    db4o assigns internal IDs to any stored first class object. These internal IDs are guaranteed to be unique within one ObjectContainer/ObjectServer and they will stay the same for every object when an ObjectContainer/ObjectServer is closed and reopened. Internal IDs will change when an object is moved from one ObjectContainer to another, as it happens during Defragment.


    16.2. Unique Universal IDs (UUIDs)

    For long term external references and to identify an object even after it has been copied or moved to another ObjectContainer, db4o supplies UUIDs. These UUIDs are not generated by default, since they occupy some space and consume some performance for maintaining their index. UUIDs can be turned on globally or for individual classes:
    FileConfiguration#generateUUIDs(Integer.MAX_VALUE);
    Db4o.configure().objectClass(Foo.class).generateUUIDs(true);

    The respective methods for working with UUIDs are:
    ExtObjectContainer#getObjectInfo(Object)
    ObjectInfo#getUUID();
    ExtObjectContainer#getByUUID(Db4oUUID);