JPA Multiple Embedded fields
Is it possible for a JPA entity class to contain two embedded (@Embedded
) fields? An example would be:
@Entity
public class Person {
@Embedded
public Address home;
@Embedded
public Address work;
}
public class Address {
public String street;
...
}
In this case a Person
can contain two Address
instances - home and work. I'm using JPA with Hibernate's implementation. When I generate the schema using Hibernate Tools, it only embeds one Address
. What I'd like is two embedded Address
instances, each with its column names distinguished or pre-pended with some prefix (such as home and work). I know of @AttributeOverrides
, but this requires that each attribute be individually overridden. This can get cumbersome if the embedded object (Address
) gets big as each column needs to be individually overridden.
The generic JPA way to do it is with @AttributeOverride. This should work in both EclipseLink and Hibernate.
@Entity
public class Person {
@AttributeOverrides({
@AttributeOverride(name="street",column=@Column(name="homeStreet")),
...
})
@Embedded public Address home;
@AttributeOverrides({
@AttributeOverride(name="street",column=@Column(name="workStreet")),
...
})
@Embedded public Address work;
}
@Embeddable public class Address {
@Basic public String street;
...
}
}
If you want to have the same embeddable object type twice in the same entity, the column name defaulting will not work: at least one of the columns will have to be explicit. Hibernate goes beyond the EJB3 spec and allows you to enhance the defaulting mechanism through the NamingStrategy. DefaultComponentSafeNamingStrategy is a small improvement over the default EJB3NamingStrategy that allows embedded objects to be defaulted even if used twice in the same entity.
From Hibernate Annotations Doc: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e714