An embedded object is one that is wholly owned by a parent entity, in the UML compositional ("colour in the black diamond") sense. Using domain-driven design terminology it is an aggregated object (with its owning entity the aggregate root).
The @javax.persistence.Embeddable
annotation defines an embedded object, that is, a class whose instances
are stored as an intrinsic part of an owning entity and share the
identity of the entity. Note that @Embeddable
entities must not also be annotated with @Entity
.
They also do not have an @Id
. That's because each
of the persistent properties of the embedded object is mapped to the
database table for the entity. JPA restricts the
embedded objects to only consisting of @Basic
(value) properties.
Having defined an embeddable class, the owning entity defines an
association using the
@javax.persistence.Embeddable
annotation. In
Naked Objects terms this is a property whose return type is the
@Embeddable
class. For example, consider an
Address
class:
@Embeddable public class Address { private Integer houseNumber; @Basic public Integer getHouseNumber() { ... } public void setHouseNumber(Integer houseNumber) { ... } private String streetName; @Basic public String getStreetName() { ... } public void setStreetName(Integer streetName) { ... } ... }
The owning root Customer
entity might look
like:
@Entity @DiscriminatorValue("CUS") public class Customer { private Integer id; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { ... } private void setId(Integer id) { ... } private Address address; @Embedded public Address getAddress() { ... } ... }
Although JPA defines the
@EmbeddedId
annotation (to indicate a property
whose type represents a composite primary key that is an embeddable
class), JPA Objects does not support this (because
in JPA Objects all primary keys must be simple, not
composite).