One-to-One Mapping in Hibernate

When mapping two entities, we annotate both classes as @Entity and the mapping type is specified as @OneToOne, @OneToMany, @ManyToOne or @ManyToMany over the declaration of one entity class in the other entity class. In One-To-One mapping, we refer to one entity from another and mark the reference variable as @OneToOne.

 

We will see an example mapping of two entity classes – student class and course class; and do a one to one mapping from course to student. We will assume that there is a one-to-one mapping between a Course and Student – each course can be taken by only one student.  If you are not following the tutorials in order, refer to the article http://javajee.com/your-first-hibernate-program for the basic setup including hibernate configuration file. You should replace the user class in the configuration file with both course and student classes as:

<!-- Names the annotated entity class -->

<mapping class="com.javajee.hiberex.dto.Student"/>

<mapping class="com.javajee.hiberex.dto.Course"/>

Else you will get org.hibernate.MappingException: Unknown entity:…

 

The student class will be a normal entity class similar to our earlier user class (except for name).

Our Student class will look as below:

package com.javajee.hiberex.dto;

 

import javax.persistence.Entity;

import javax.persistence.Id;

 

@Entity

public class Student {

 

  @Id

  private int studId;

  private String studName;

 

//Getters and setters not shown here; create them manually or generate in eclipse.

}

 

The Course class is similar to the Student class, but will have a reference to the student class annotated as @OneToOne:

package com.javajee.hiberex.dto;

 

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToOne;

 

@Entity

public class Course {

 

  @Id @GeneratedValue

  private int courseId;

  private String courseName;

 

  @OneToOne

  private Student stud;

 

//Getters and setters not shown here; create them manually or generate in eclipse.

}

 

We also need a test class to test. The test class will look as below:

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import com.javajee.hiberex.dto.Course;

import com.javajee.hiberex.dto.Student;

 

public class CourseTest {

 

  public static void main(String[] args) {

 

    Student stud = new Student();

    stud.setStudName("Stud1");

    Course course = new Course();

    course.setCourseName("C1");

    course.setStud(stud);

 

    Configuration configuration = new Configuration();

    configuration.configure();

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()

        .applySettings(configuration.getProperties()).buildServiceRegistry();

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    Session session = sessionFactory.openSession();

    session.beginTransaction();

    session.save(stud);

    session.save(course);

    session.getTransaction().commit();

  }

 

}

 

If you run CourseTest.java (after you generate all getters and setters for course and student), you will see the below queries in console:

Hibernate: insert into Student (studName) values (?)

Hibernate: insert into Course (courseName, stud_studId) values (?, ?)

 

Here, Student class is saved with an auto generated id and Course class has an extra column that has the corresponding student id.

Now make a small modification to the test class. Change the order of save of student and course as:

session.save(course);

session.save(stud);

 

If you run CourseTest.java, you will see the below queries in console:

Hibernate: insert into Course (courseName, stud_studId) values (?, ?)

Hibernate: insert into Student (studName) values (?)

Hibernate: update Course set courseName=?, stud_studId=? where courseId=?

 

When data is inserted to Course table, studId is not known, but after inserting into Student table, the studId is updated in Course table. Here the join column is stud_studId and you can change its name using @JoinColumn() annotation as:

  @OneToOne

  @JoinColumn(name="stud_id")

  private Student stud;

 

Tags: 

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)