Thursday 25 December 2014

Embeddable : Embedding value object into entity object


A value object is an object, which don’t have any identity independently. Let’s say there is an Employee object and Address object. Address object alone don’t have any meaning. Address object has meaning, when it used in combination with Employee object.

If you want to embed Address(value) object in Employee (entity) object, Address object should be annotated with “@Embeddable” annotation

package myFirstHibernate;

import javax.persistence.Embeddable;

@Embeddable
public class Address {
  private String street;
  private String city;
  private String state;
  private String PIN;
  private String country;
  
  public String getStreet() {
    return street;
  }
  
  public void setStreet(String street) {
    this.street = street;
  }
  
  public String getCity() {
    return city;
  }
  
  public void setCity(String city) {
    this.city = city;
  }
  
  public String getState() {
    return state;
  }
  
  public void setState(String state) {
    this.state = state;
  }
  
  public String getPIN() {
    return PIN;
  }
  
  public void setPIN(String pIN) {
    PIN = pIN;
  }
  
  public String getCountry() {
    return country;
  }
  
  public void setCountry(String country) {
    this.country = country;
  }
  
}

package myFirstHibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;

import java.util.Date;

@Entity
public class Employee {
  @Id
  private int id;
  
  private String firstName;
  private String lastName;
  private Address address;
  
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getFirstName() {
    return firstName;
  }
  
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  
  public String getLastName() {
    return lastName;
  }
  
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  
  public Address getAddress() {
    return address;
  }
  
  public void setAddress(Address address) {
    this.address = address;
  }
  
}


hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

  <session-factory>
  
    <!--  Database Connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost/sample</property>
    <property name="connection.username">root</property>
    <property name="connection.password">tiger</property>
    
    <!-- Enable the logging of all the generated SQL statements to the console -->
    <property name="show_sql">true</property>
    
    <!-- Format the generated SQL statement to make it more readable, -->
    <property name="format_sql">false</property>
    
    <!-- Hibernate will put comments inside all generated SQL statements to hint what’s the generated SQL trying to do -->
    <property name="use_sql_comments">false</property>
    
    <!-- This property makes Hibernate generate the appropriate SQL for the chosen database. -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>
    
    <!-- mappings for annotated classes -->
    <mapping class="myFirstHibernate.Employee" />
    
  </session-factory>
  
</hibernate-configuration>


TestEmployee.java
package myFirstHibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import java.util.Date;

public class TestEmployee {
  
  /* Step 1: Create session factory */
  private static SessionFactory getSessionFactory() {
    Configuration configuration = new Configuration().configure();
    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
    applySettings(configuration.getProperties());
    SessionFactory factory = configuration.buildSessionFactory(builder.build());
        return factory;
    }
  
  public static void main(String args[]){
    Employee emp1 = new Employee();
    emp1.setId(1);
    emp1.setFirstName("Hari Krishna");
    emp1.setLastName("Gurram");
    
    Address addr = new Address();
    addr.setCity("Bangalore");
    addr.setCountry("India");
    addr.setPIN("560037");
    addr.setState("Karnataka");
    addr.setStreet("Chowdeswari street");

    emp1.setAddress(addr);
    
    /* To persisit data */
    SessionFactory sessionFactory = getSessionFactory();
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save(emp1);
    session.getTransaction().commit();
    session.close();   
  }
}


Run TestEmployee.java, you will get output like below.
Hibernate: drop table if exists Employee
Hibernate: create table Employee (id integer not null, PIN varchar(255), city varchar(255), country varchar(255), state varchar(255), street varchar(255), firstName varchar(255), lastName varchar(255), primary key (id))
Dec 20, 2014 9:26:38 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into Employee (PIN, city, country, state, street, firstName, lastName, id) values (?, ?, ?, ?, ?, ?, ?, ?)


As you observe, table created like below.
mysql> select * from employee;
+----+--------+-----------+---------+-----------+--------------------+--------------+----------+
| id | PIN    | city      | country | state     | street             | firstName    | lastName |
+----+--------+-----------+---------+-----------+--------------------+--------------+----------+
|  1 | 560037 | Bangalore | India   | Karnataka | Chowdeswari street | Hari Krishna | Gurram   |
+----+--------+-----------+---------+-----------+--------------------+--------------+----------+
1 row in set (0.00 sec)


Address fields are embedded in employee class. There is no separate table for address class.



Prevoius                                                 Next                                                 Home

No comments:

Post a Comment