Engineering Full Stack Apps with Java and JavaScript
An entity is a type on its own and has an existence of its own (e.g. Course, User etc.).
A value type is a type which doesn't have existence of its own, but belongs to an entity (e.g. Address of an User). Value types are always completely owned by their containing entity.
Defining entities and value types in Hibernate
@Entity annotation (javax.persistence.Entity) over the class tell hibernate to treat this class as our entity class that needs to be saved.
The hibernate specific Entity annotation org.hibernate.annotations.Entity has been deprecated in hibernate 4.
To embed a value within an Entity, we have to annotate the embedded class as @Embeddable and annotate the reference variable to the value type class in the embedding class as @Embedded. Even though @Embedded is optional when you have @Embeddable, it is better to have them both.
There is a special case: @Embedded and @Id won’t work together. To get the combined behaviour of @Embedded and @Id, we should use @EmbeddedId annotation.
Important points to remember about entities in Hibernate
An entity is a type on its own. A value type is a type which doesn't have existence of its own, but belongs to an entity (e.g. Address of an User).
An entity class can refer to other entity classes or embed value types.
Once you delete the entity, its associated value types are also deleted. E.g. When a User id deleted, his Address is also deleted. When you delete an entity, referenced entities still exist. E.g. When you delete a Course entity, you don't delete all its students.
Unlike EJB, the Hibernate entities are not remotable.
Entities can be accessed through the JPA javax.persistence.EntityManager or the Hibernate org.hibernate.Session object.
Entity classes must have a public or protected no-arg constructor; it may have other constructors as well.
Entity classes must be a top-level class.
Entity classes must must not be final.
If the entity is to be passed by value (that is, through a remote interface), it must implement a Serializable interface.
The entity’s instance variables must be accessed only from within the entity class. Hence, the instance variables must be declared as private, protected, or default (no access specifier).
Every entity must have a primary key that must be declared only once in the entity’s inheritance hierarchy.
Every nonstatic and nontransient property of an entity bean is considered persistent unless you specify them @Transient. @Transient properties are ignored by the EntityManager.