Entity Annotations
ObjectBox database persistence for Java is based on objects for object-oriented programming instead of SQL. Learn how to persist entities with entity annotations in this tutorial section.
ObjectBox - Database Persistence with Entity Annotations
ObjectBox is a database that persists objects. For a clear distinction, we sometimes call those persistable objects entities.
To let ObjectBox know which classes are entities you annotate them with @Entity
. This annotation identifies the class User
in the following example as a persistable entity. This will trigger ObjectBox to generate persistence code tailored for this class:
Object IDs: @Id
In ObjectBox, entities must have one 64-bit integer ID property with non-private visibility (or non-private getter and setter method) to efficiently get or reference objects.
ID properties are unique and indexed by default.
Make entity data accessible
ObjectBox needs to access the data of your entity’s properties (e.g. in the generated code). You have two options:
Make sure properties do not have private visibility.
Provide standard getters (your IDE can generate them easily).
To improve performance when ObjectBox constructs your entities, you might also want to provide an all-properties constructor.
Supported property types
ObjectBox can store almost any type (class) of property as long as it can be converted to one of the built-in types. See the dedicated page for details:
Basic annotations for entity properties
Transient
@Transient
marks properties that should not be persisted. In Java static
or transient
properties will also not be persisted.
NameInDb
@NameInDb
lets you define a name on the database level for a property. This allows you to rename the property without affecting the property name on the database level.
@NameInDb only works with inline constants to specify a column name.
Property Indexes
Annotate a property with @Index
to create a database index for the corresponding database column. This can improve performance when querying for that property.
@Index is currently not supported for String[]
, byte[]
, float
and double
An index stores additional information in the database to make lookups faster. As an analogy, we could look at Java-like programming languages where you store objects in a list. For example, you could store persons using a List<Person>
. Now, you want to search for all persons with a specific name so you would iterate through the list and check for the name property of each object. This is an O(N) operation and thus doesn't scale well with an increasing number of objects. To make this more scalable you can introduce a second data structure Map<String, Person>
with the name as a key. This will give you a constant lookup time (O(1)). The downside of this is that it needs more resources (here: RAM) and slows down add/remove operations on the list a bit. These principles can be transferred to database indexes, just that the primary resource consumed is disk space.
Index types (String)
For scalar properties, ObjectBox uses a value-based index. Because String
properties typically require more storage space than scalar values, by default ObjectBox uses a hash index for strings instead.
To override the default and use a value-based index for a String
property, specify the index type
:
Keep in mind that for String
, depending on the length of your values, a value-based index may require more storage space than the default hash-based index.
ObjectBox supports these index types:
Not specified or DEFAULT Uses the best index based on property type (HASH for
String
, VALUE for others).VALUE Uses property values to build the index. For
String,
this may require more storage than a hash-based index.HASH Uses a 32-bit hash of property values to build the index. Occasional collisions may occur which should not have any performance impact in practice. Usually, a better choice than HASH64, as it requires less storage.
HASH64 Uses a 64-bit hash of property values to build the index. Requires more storage than HASH and thus should not be the first choice in most cases.
Vector Index for Nearest Neighbor Search
To enable nearest neighbor search, a special index type for vector properties is available:
Unique constraints
Annotate a property with @Unique
to enforce that values are unique before an entity is put:
A put()
operation will abort and throw a UniqueViolationException
if the unique constraint is violated:
For a single property it is possible to specify that a conflicting object should be replaced instead of an exception being thrown:
The REPLACE
strategy will add a new object with a different ID. As relations (ToOne/ToMany) reference objects by ID, if the previous object was referenced in any relations, these need to be updated manually.
Change database type
Use @Type
in Java/Kotlin or the type attribute on @Property
in Dart to override how the value of a property is stored and interpreted in the database.
Relations
Triggering code generation
Last updated
Was this helpful?