Search code examples
hibernatejpaannotationsembeddable

How to use more than one Component type (Embedded, Embeddable) in annotation


I google, but all example only showing me one Component in one object, for example:

https://dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-component-using-annotations-1.html

I want to have two Component in one object, for example:

public class PhoneNumber {
   // Phone details
   private int areaCode = 0;
   private int phoneNumber = 0;
   private String name = null;
}

public class Person {
   private String firstName = null;
   private String nickName = null;
   private String lastName = null;
   // Multiple phone details
   private PhoneNumber homePhone = null;
   private PhoneNumber mobilePhone = null;
}

Hibernate mapping:

<class name="Person" table="PERSON">
 <id name="id" column="PERSON_ID">
  <generator class="native"/>
 </id>

 <property name="firstName" column="FIRST_NAME" />
 ...

 <component name="homePhone" class="PhoneNumber">
  <property name="areaCode" column="HOME_AREA_CODE"/>
  <property name="phoneNumber" column="HOME_PHONE_NUMBER"/>
  <property name="name" column="HOME_NAME"/>
 </component>

 <component name="mobilePhone" class="PhoneNumber">
  <property name="areaCode" column="MOBILE_AREA_CODE"/>
  <property name="phoneNumber" column="MOBILE_PHONE_NUMBER"/>
  <property name="name" column="MOBILE_NAME"/>
 </component>
</class>

I have two Component above, homePhone and mobilePhone. How to translate above Hibernate mapping into Java annotation?


Solution

  • @Embeddable    
    public class PhoneNumber {
     // Phone details
      private int areaCode = 0;
      private int phoneNumber = 0;
       private String name = null;
     }
    
     public class Person {
       private String firstName = null;
       private String nickName = null;
       private String lastName = null;
       // Multiple phone details
       @Embedded
       @AttributeOverrides({
       @AttributeOverride(name="areaCode",column=@Column(name="HOME_AREA_CODE"),
        @AttributeOverride(name="phoneNumber",column=@Column(name="HOME_PHONE_NUMBER"),
      @AttributeOverride(name="name",column=@Column(name="HOME_NAME")})
       private PhoneNumber homePhone = null;
      @Embedded
      @AttributeOverrides({
      @AttributeOverride(name="areaCode",column=@Column(name="MOBILE_AREA_CODE"),
      @AttributeOverride(name="phoneNumber",column=@Column(name="MOBILE_PHONE_NUMBER"),
      @AttributeOverride(name="name",column=@Column(name="MOBILE_NAME")})
       private PhoneNumber mobilePhone = null;
       }
    

    Annotate you Phone class with @Embeddable

    As for each phone component the column name differs. Use the @AttributeOverrride and specify the appropriate column name in you owing entity.This will map the component class to different columns.