2.2.2. Mapping simple properties
2.2.2.1. Declaring basic property mappings
Every non static non transient property (field or method) of an entity bean is considered persistent, unless you annotate it as
@Transient
. Not having an annotation for your property is equivalent to the appropriate @Basic
annotation. The @Basic
annotation allows you to declare the fetching strategy for a property:
public transient int counter; //transient property private String firstname; //persistent property @Transient String getLengthInMeter() { ... } //transient property String getName() {... } // persistent property @Basic int getLength() { ... } // persistent property @Basic(fetch = FetchType.LAZY) String getDetailedComment() { ... } // persistent property @Temporal(TemporalType.TIME) java.util.Date getDepartureTime() { ... } // persistent property @Enumerated(EnumType.STRING) Starred getNote() { ... } //enum persisted as String in database
counter
, a transient field, and lengthInMeter
, a method annotated as @Transient
, and will be ignored by the entity manager. name
, length
, and firstname
properties are mapped persistent and eagerly fetched (the default for simple properties). The detailedComment
property value will be lazily fetched from the database once a lazy property of the entity is accessed for the first time. Usually you don't need to lazy simple properties (not to be confused with lazy association fetching).
Note
To enable property level lazy fetching, your classes have to be instrumented: bytecode is added to the original one to enable such feature, please refer to the Hibernate reference documentation. If your classes are not instrumented, property level lazy loading is silently ignored.
The recommended alternative is to use the projection capability of EJB-QL or Criteria queries.
EJB3 support property mapping of all basic types supported by Hibernate (all basic Java types , their respective wrappers and serializable classes). Hibernate Annotations support out of the box Enum type mapping either into a ordinal column (saving the enum ordinal) or a string based column (saving the enum string representation): the persistence representation, defaulted to ordinal, can be overriden through the
@Enumerated
annotation as shown in the note
property example.
In core Java APIs, the temporal precision is not defined. When dealing with temporal data you might want to describe the expected precision in database. Temporal data can have
DATE
, TIME
, or TIMESTAMP
precision (ie the actual date, only the time, or both). Use the @Temporal
annotation to fine tune that.
@Lob
indicates that the property should be persisted in a Blob or a Clob depending on the property type: java.sql.Clob
, Character[]
, char[]
and java.lang.String
will be persisted in a Clob. java.sql.Blob
, Byte[]
, byte[]
and serializable type will be persisted in a Blob.
@Lob public String getFullText() { return fullText; } @Lob public byte[] getFullCode() { return fullCode; }
If the property type implements
java.io.Serializable
and is not a basic type, and if the property is not annotated with @Lob
, then the Hibernate serializable
type is used.