14 - Association Mapping in Hebernate: Page 3 of 4

14.4 One to One mapping

When exactly one instance is mapped to one instance of another entity, it is said to be one to one association. We discussed many to one mapping and adding unique=true can be equivalent to one to one mapping.

Hibernate does provide one to one tag also, which works on sharing primary keys concept.

Let’s take the simple scenario of having “One Person can have one and only one Passport” .

Passport.java

package com.tutorial.hibernate;

public class Passport {

     private int id;    
     private String number;
     public int getId() {
        return id;
     }
     public void setId(int id) {
        this.id = id;
     }
     public String getNumber() {
        return number;
     }
     public void setNumber(String number) {
        this.number = number;
     }    
}

Person.java

package com.tutorial.hibernate;

public class Person {

      private int id;    
      private String name;    
      private Passport passport;

      public int getId() {
        return id;
      }
      public void setId(int id) {
        this.id = id;
      }
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public Passport getPassport() {
        return passport;
      }
      public void setPassport(Passport passport) {
        this.passport = passport;
      }
}

association-mapping.hbm.xml

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

<hibernate-mapping>
    <class name="com.tutorial.hibernate.Person" table="Person">
        <id name="id" type="int" column="person_id">
            <generator class="native" />
        </id>
        <property name="name" column="name" type="string" />
        <many-to-one name="passport" class="com.tutorial.hibernate.Passport" column="passport_id" unique="true">
        </many-to-one>        
    </class>
    <class name="com.tutorial.hibernate.Passport" table="Passport">
        <id name="id" type="int" column="passport_id">
            <generator class="native" />
        </id>

        <property name="number" type="string" column="number" />
    </class>
</hibernate-mapping>

Create Tables – Additional Unique constraint is added.

CREATE TABLE 'passport' (
  'passport_id' int(11) NOT NULL AUTO_INCREMENT,
  'number' varchar(255) DEFAULT NULL,
  PRIMARY KEY ('passport_id')
);

CREATE TABLE 'person' (
  'person_id' int(11) NOT NULL AUTO_INCREMENT,
  'name' varchar(255) DEFAULT NULL,
  'passport_id' int(11) DEFAULT NULL,
  PRIMARY KEY ('person_id'),
  UNIQUE KEY 'UK_ftm9hktcvlofmq537l99ywv9g' ('passport_id'),
  CONSTRAINT 'FK_ftm9hktcvlofmq537l99ywv9g' FOREIGN KEY ('passport_id') REFERENCES 'passport' ('passport_id')
); 

Test Program

import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.tutorial.hibernate.CricketMatch;
import com.tutorial.hibernate.Passport;
import com.tutorial.hibernate.Person;
import com.tutorial.hibernate.Stadium;

public class Test {

    private static SessionFactory factory;       
    public static void main(String args[])
    {
        Configuration cfg = new Configuration().configure();
        factory = cfg.buildSessionFactory();
 
        Session session = factory.openSession();
        Transaction tx = session.beginTransaction();

        Passport passport = new Passport();
        passport.setNumber("ABCDEFG");

        Person person = new Person();
        person.setName("Person A");
        person.setPassport(passport);

        session.save(passport);
        int personId = (Integer)session.save(person);

        tx.commit();        
        session.close();

        getPersonDetails(personId);        
        factory.close();        
    }
  
    private static void getPersonDetails(int id)
    {
        Session session = factory.openSession();        
        Person person = (Person)session.get(Person.class,id);        
        Passport passport  = person.getPassport();

        String name = person.getName();
        String number=passport.getNumber();
        System.out.println("Person Name =" +  name);
        System.out.println("Passport Number = " + number);
    }
}

Run the Program 

Person Table

Passport table

 

Like us on Facebook