Hibernate One To One Relation Mapping Example

Hibernate One To One Relation Mapping Example explains about how to implement a One To One relationship by using Hibernate

one-to-one entity relationship, each record of an entity have single records in other associated entity

On this standalone Hibernate One To One Relation Mapping Example, we are using Hibernate With MySQL Database.

Note

You can also check following related Hibernate Tutorial Series

1)    Hibernate One To One Relation Mapping Example
2)    Hibernate One To Many Relation Mapping Example
3)    Hibernate Many To One Relation Mapping Example
4)    Hibernate Many To Many Relation Mapping Example

Let us see how to implement one-to-one relationship using Hibernate

Required Libraries

You need to download

  1. JDK 7
  2. Eclipse 3.7
  3. Hibernate 4.3.1
  4. Mysql 5.1.30

Following jar must be in classpath

  1. antlr-2.7.7.jar
  2. dom4j-1.6.1.jar
  3. hibernate-commons-annotations-4.0.4.Final.jar
  4. hibernate-core-4.3.1.Final.jar
  5. hibernate-entitymanager-4.3.1.Final.jar
  6. jandex-1.1.0.Final.jar
  7. dom4j-1.6.1.jar
  8. jboss-logging-3.1.3.GA.jar
  9. hibernate-jpa-2.1-api-1.0.0.Final.jar
  10. jboss-transaction-api_1.2_spec-1.0.0.Final.jar
  11. mysql-connector-java-5.1.28-bin.jar
Note

By using hibernate.hbm2ddl.auto property, hibernate automatically create below table structure, so you only need to have the following property in hibernate.cfg.xml

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

Table structure

CREATE TABLE `address` (
  `ADDRESSID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CITY` varchar(255) DEFAULT NULL,
  `COUNTRY` varchar(255) DEFAULT NULL,
  `STATE` varchar(255) DEFAULT NULL,
  `STREET` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ADDRESSID`)
);

CREATE TABLE `employee` (
  `EMPLOYEEID` bigint(20) NOT NULL AUTO_INCREMENT,
  `EMPLOYEENAME` varchar(255) DEFAULT NULL,
  `EMPLOYEE_ADDRESS` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`EMPLOYEEID`),
  KEY `FK_l0riirnsn4v732alachn9utyt` (`EMPLOYEE_ADDRESS`),
  CONSTRAINT `FK_l0riirnsn4v732alachn9utyt` FOREIGN KEY (`EMPLOYEE_ADDRESS`) REFERENCES `address` (`ADDRESSID`)
);

Create Address & Employee model classes as per the above table structure

Address.java

package com.hibernate.onetoone;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Address implements java.io.Serializable {

   
private static final long serialVersionUID = 1L;
   
@Id
    @GeneratedValue
    @Column
(name = "ADDRESSID")
   
private long addressID;
   
@Column(name = "STREET")
   
private String street;
   
@Column(name = "CITY")
   
private String city;
   
@Column(name = "STATE")
   
private String state;
   
@Column(name = "COUNTRY")
   
private String country;
   

   
public Address() {
       
super();
   
}

   
public Address(String street, String city, String state, String country) {
       
this.street = street;
       
this.city = city;
       
this.state = state;
       
this.country = country;
   
}

   
public long getAddressID() {
       
return addressID;
   
}

   
public void setAddressID(long addressID) {
       
this.addressID = addressID;
   
}
   
   

   
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 getCountry() {
       
return country;
   
}

   
public void setCountry(String country) {
       
this.country = country;
   
}

   
}

Employee.java

package com.hibernate.onetoone;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;



@Entity
public class Employee implements java.io.Serializable {

   
private static final long serialVersionUID = 1L;
   
   
@Id
    @GeneratedValue
    @Column
(name = "EMPLOYEEID")
   
private long employeeId;
   
@Column(name = "EMPLOYEENAME")
   
private String employeeName;
   
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY)
   
@JoinColumn(name = "EMPLOYEE_ADDRESS")
   
private Address address;

   
public Employee() {
       
super();
   
}

   
public Employee(String employeeName, Address address) {
       
this.employeeName = employeeName;
       
this.address = address;
   
}

   
public long getEmployeeId() {
       
return employeeId;
   
}

   
public void setEmployeeId(long employeeId) {
       
this.employeeId = employeeId;
   
}

   
public String getEmployeeName() {
       
return employeeName;
   
}

   
public void setEmployeeName(String employeeName) {
       
this.employeeName = employeeName;
   
}

   
public Address getAddress() {
       
return address;
   
}

   
public void setAddress(Address address) {
       
this.address = address;
   
}

   
}
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY) annotation is used for linking single record of Employee table with single record of Address table
@JoinColumn(name = "EMPLOYEE_ADDRESS") , which is connecting employee & address tables by using keyword @JoinColumn (EMPLOYEE_ADDRESS)
@Entity declares the class as an entity (i.e. a persistent POJO class)
@Table is set at the class level; it allows you to define the table, catalog, and schema names for your entity mapping. If no @Table is defined the default values are used: the unqualified class name of the entity.
@Id declares the identifier property of this entity.
@GeneratedValue annotation is used to specify the primary key generation strategy to use. If the strategy is not specified by default AUTO will be used.
@Column annotation is used to specify the details of the column to which a field or property will be mapped. If the @Column annotation is not specified by default the property name will be used as the column name.

HibernateUtil.java

package com.hibernate.onetoone;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

   
private static SessionFactory    sessionFactory;
   
private static ServiceRegistry    serviceRegistry;

   
public static SessionFactory createSessionFactory() {
       
Configuration configuration = new Configuration();
        configuration.configure
("/META-INF/hibernate.cfg.xml");
        serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
               
.build();
        sessionFactory = configuration.buildSessionFactory
(serviceRegistry);
       
return sessionFactory;
   
}
}

hibernate.cfg.xml

hibernate.cfg.xml file must be under src/META-INF (Please check the screenshot(project structure)

<?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>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">1</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create-drop</property>
        <mapping class="com.hibernate.onetoone.Employee"/>
        <mapping class="com.hibernate.onetoone.Address"/>
    </session-factory>
</hibernate-configuration>

Project Structure

Now project structure looks like following

Hibernate One To One Mapping Example

Just execute below class and see the output

HibernateOneToOneExample.java

package com.hibernate.onetoone;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class HibernateOneToOneExample {

   
public static void main(String[] args) {
       
Session session = HibernateUtil.createSessionFactory().openSession();
        Transaction transaction =
null;
       
try {
           
transaction = session.beginTransaction();
          
            Address address1 =
new Address("Padma Junction", "Cochin",
                   
"Kerala", "India");
            Address address2 =
new Address("Eden Road", "Kolkota", "Bengal",
                   
"India");
            Employee employee1 =
new Employee("Rockey", address1);
            Employee employee2 =
new Employee("Jose", address2);
          
            session.save
(employee1);
            session.save
(employee2);
            transaction.commit
();
       
catch (Exception e) {
           
transaction.rollback();
       
}finally {
           
session.close();
       
}
    }

}
Output
ADDRESSID CITY COUNTRY STATE STREET
1 Cochin India Kerala Padma Junction
2 Kolkota India Bengal Eden Road
EMPLOYEEID EMPLOYEENAME EMPLOYEE_ADDRESS
1 Rockey 1
2 Jose 2

 





Your email address will not be published. Required fields are marked *