Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 819
Steve Kuo Avatar asked Dec 01 '08 18:12

Steve Kuo


Video Answer


2 Answers

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;     ...   } } 
like image 51
Philihp Busby Avatar answered Sep 24 '22 13:09

Philihp Busby


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

like image 41
Loki Avatar answered Sep 23 '22 13:09

Loki