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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With