How does many to many relationship work in Hibernate?
In many to mant relationship each row in table A linked to multiple rows in table B and vice versa.Here is an example of Student and course. one student can chose multiple subject in the same way 1 course can be assigned to multiple student.
Configuration file : hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/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/hibernaterelationship</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">create-drop</property> <!-- Mapping files --> <mapping class="net.roseindia.table.Course" /> <mapping class="net.roseindia.table.Student" /> </session-factory> </hibernate-configuration>
Table classes :
Course.java
package net.roseindia.table; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "course") public class Course { private int courseId; private String courseName; public Course(String course) { // TODO Auto-generated constructor stub this.courseName=course; } @Id @GeneratedValue @Column(name = "courseId", nullable = false) public int getCourseId() { return courseId; } public void setCourseId(int courseId) { this.courseId = courseId; } @Column(name = "courseName", nullable = false) public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } }
Student.java
package net.roseindia.table; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; @Entity @Table(name="student") public class Student { private int id; private String name; private Set<Course> courses = new HashSet<Course>(); public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public Student(String name, Set<Course> courses) { this.name = name; this.courses = courses; } @Id @GeneratedValue @Column(name = "studentId", nullable = false) public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "studentName", nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade=CascadeType.ALL) public Set<Course> getCourses() { return courses; } public void setCourses(Set<Course> courses) { this.courses = courses; } }
Continued..
Util Class:HibernateUtil.java
package net.roseindia.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; public class HibernateUtil { private static SessionFactory sessionFactory = null; static { sessionFactory = new AnnotationConfiguration().configure() .buildSessionFactory(); } public static SessionFactory getseSessionFactory() { return sessionFactory; } }
Main Class : ManyToMany.java
package net.roseindia.application; import java.util.HashSet; import java.util.Set; import net.roseindia.table.Course; import net.roseindia.table.Student; import net.roseindia.util.HibernateUtil; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; public class ManyToMany{ public static void main(String[] args){ Session session=HibernateUtil.getseSessionFactory().openSession(); Transaction transaction=null; try{ transaction=session.beginTransaction(); Set<Course> courses=new HashSet<Course>(); courses.add(new Course("Maths")); courses.add(new Course("Science")); Student student1=new Student("Ron", courses); Student student2=new Student("Ric",courses); session.save(student1); session.save(student2); transaction.commit(); }catch(HibernateException he){ System.out.println(he.getMessage()); } finally{ session.close(); } } }
Output:
Hibernate: insert into student (studentName) values (?) Hibernate: insert into course (courseName) values (?) Hibernate: insert into course (courseName) values (?) Hibernate: insert into student (studentName) values (?) Hibernate: insert into student_course (student_studentId, courses_courseId) values (?, ?) Hibernate: insert into student_course (student_studentId, courses_courseId) values (?, ?) Hibernate: insert into student_course (student_studentId, courses_courseId) values (?, ?) Hibernate: insert into student_course (student_studentId, courses_courseId) values (?, ?)
see this simple annotation example
Ads