In this example you will learn how to map many-to-many relationship using Hibernate Annotations. Consider the following relationship between Student and Course entity.
According to the relationship a student can enroll in any number of courses and the course can have any number of students.
To create this relationship you need to have a STUDENT, COURSE and STUDENT_COURSE table. The relational model is shown below.
To create the STUDENT, COURSE and STUDENT_COURSE table you need to create the following Java Class files.
Student class is used to create the STUDENT and STUDENT_COURSE table.
01.package com.vaannila.student;02. 03.import java.util.HashSet;04.import java.util.Set;05. 06.import javax.persistence.CascadeType;07.import javax.persistence.Column;08.import javax.persistence.Entity;09.import javax.persistence.GeneratedValue;10.import javax.persistence.Id;11.import javax.persistence.JoinColumn;12.import javax.persistence.JoinTable;13.import javax.persistence.ManyToMany;14.import javax.persistence.Table;15. 16.@Entity17.@Table(name = "STUDENT")18.public class Student {19. 20.    private long studentId;21.    private String studentName;22.    private Set<Course> courses = new HashSet<Course>(0);23. 24.    public Student() {25.    }26. 27.    public Student(String studentName) {28.        this.studentName = studentName;29.    }30. 31.    public Student(String studentName, Set<Course> courses) {32.        this.studentName = studentName;33.        this.courses = courses;34.    }35. 36.    @Id37.    @GeneratedValue38.    @Column(name = "STUDENT_ID")39.    public long getStudentId() {40.        return this.studentId;41.    }42. 43.    public void setStudentId(long studentId) {44.        this.studentId = studentId;45.    }46. 47.    @Column(name = "STUDENT_NAME", nullable = false, length = 100)48.    public String getStudentName() {49.        return this.studentName;50.    }51. 52.    public void setStudentName(String studentName) {53.        this.studentName = studentName;54.    }55. 56.    @ManyToMany(cascade = CascadeType.ALL)57.    @JoinTable(name = "STUDENT_COURSE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "COURSE_ID") })58.    public Set<Course> getCourses() {59.        return this.courses;60.    }61. 62.    public void setCourses(Set<Course> courses) {63.        this.courses = courses;64.    }65. 66.}Course class is used to create the COURSE table.
01.package com.vaannila.student;02. 03.import javax.persistence.Column;04.import javax.persistence.Entity;05.import javax.persistence.GeneratedValue;06.import javax.persistence.Id;07.import javax.persistence.Table;08. 09.@Entity10.@Table(name="COURSE")11.public class Course {12. 13.    private long courseId;14.    private String courseName;15. 16.    public Course() {17.    }18. 19.    public Course(String courseName) {20.        this.courseName = courseName;21.    }22. 23.    @Id24.    @GeneratedValue25.    @Column(name="COURSE_ID")26.    public long getCourseId() {27.        return this.courseId;28.    }29. 30.    public void setCourseId(long courseId) {31.        this.courseId = courseId;32.    }33. 34.    @Column(name="COURSE_NAME", nullable=false)35.    public String getCourseName() {36.        return this.courseName;37.    }38. 39.    public void setCourseName(String courseName) {40.        this.courseName = courseName;41.    }42. 43.}01.<?xml version="1.0" encoding="UTF-8"?>02.<!DOCTYPE hibernate-configuration PUBLIC03.        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"05.<hibernate-configuration>06.    <session-factory>07.        <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver</property>08.        <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost<;/property>09.        <property name="hibernate.connection.username">sa</property>10.        <property name="connection.password"></property>11.        <property name="connection.pool_size">1</property>12.        <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</property>13.        <property name="show_sql">true</property>14.        <property name="hbm2ddl.auto">create-drop</property>15.        <mapping class="com.vaannila.student.Student" />16.        <mapping class="com.vaannila.student.Course" />17.    </session-factory>18.</hibernate-configuration>01.package com.vaannila.student;02. 03.import java.util.HashSet;04.import java.util.Set;05. 06.import org.hibernate.HibernateException;07.import org.hibernate.Session;08.import org.hibernate.Transaction;09. 10.import com.vaannila.util.HibernateUtil;11. 12.public class Main {13. 14.    public static void main(String[] args) {15. 16.        Session session = HibernateUtil.getSessionFactory().openSession();17.        Transaction transaction = null;18.        try {19.            transaction = session.beginTransaction();20. 21.            Set<Course> courses = new HashSet<Course>();22.            courses.add(new Course("Maths"));23.            courses.add(new Course("Computer Science"));24. 25.            Student student1 = new Student("Eswar", courses);26.            Student student2 = new Student("Joe", courses);27.            session.save(student1);28.            session.save(student2);29. 30.            transaction.commit();31.        } catch (HibernateException e) {32.            transaction.rollback();33.            e.printStackTrace();34.        } finally {35.            session.close();36.        }37. 38.    }39.}The STUDENT table has two records.
The COURSE table has two records.
The STUDENT_COURSE table has four records to link the student and courses.
Each student has enrolled in the same two courses, this illustrates the many-to-many mapping.
The folder structure of the example is shown below.
 
No comments:
Post a Comment