In the following example, we will be going through the bidirectional Many-to-Many association using Hibernate. We will be using the Student and Professor table where a student will have one or more professors. The same professor will have one or more students.
Schema Creation:
Since many-to-many is not allowed on the database level (Normalization), we will change this to add a junction-entity table in the middle. I am using the name of the junction-entity table to have the combination of both the tables.
The entities will be translated as follows:
STUDENT | STUDPROF | PROFESSOR |
ID | SID | ID |
NAME | PID | NAME |
PHNO |
| PHNO |
ADDRESS |
| DOB |
CREATE TABLE STUDENT (
ID INTEGER(5) PRIMARY KEY DEFAULT 1,
NAME VARCHAR(30) NOT NULL,
ADDRESS VARCHAR(30) NOT NULL,
PHNO VARCHAR(10) NOT NULL
);
CREATE TABLE PROFESSOR (
ID INTEGER(5) PRIMARY KEY DEFAULT 1,
NAME VARCHAR(30) NOT NULL,
PHNO VARCHAR(30) NOT NULL,
DOB DATE NOT NULL
);
CREATE TABLE STUDPROF (
SID INTEGER(5) NOT NULL DEFAULT 1,
PID INTEGER(5) NOT NULL DEFAULT 1,
PRIMARY KEY(SID, PID),
FOREIGN KEY (SID) REFERENCES STUDENT (ID),
FOREIGN KEY (PID) REFERENCES PROFESSOR (ID)
);
HBM Files Creation:
Professor.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.mybusiness.pojos">
<class name="Professor" table="PROFESSOR">
<id name="id" column="ID" type="integer">
<generator class="increment"></generator>
</id>
<property name="name" column="NAME" type="string"></property>
<property name="phNo" column="PHNO" type="string"></property>
<property name="dob" column="DOB" type="date"></property>
<set name="students" table="STUDPROF" cascade="all" lazy="false">
<key column="PID"></key>
<many-to-many column="SID" class="Student"></many-to-many>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.mybusiness.pojos">
<class name="Student" table="STUDENT">
<id name="id" column="ID">
<generator class="increment"></generator>
</id>
<property name="name" column="NAME" type="string"
update="false"></property>
<property name="address" column="ADDRESS" type="string"
update="false"></property>
<property name="phNo" column="PHNO" type="string"
update="false"></property>
<set name="professors" table="STUDPROF" cascade="all" lazy="false">
<key column="SID"></key>
<many-to-many column="PID" class="Professor"></many-to-many>
</set>
</class>
</hibernate-mapping>
Java Files:
Professor.java:
package org.mybusiness.pojos;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
public class Professor implements Serializable {
private static final long serialVersionUID = 2286787316913029844L;
private int id;
private String name;
private String phNo;
private Date dob;
private Set<Student> students;
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 String getPhNo() {
return phNo;
}
public void setPhNo(String phNo) {
this.phNo = phNo;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student.java:
package org.mybusiness.pojos;
import java.util.Set;
public class Student {
private int id;
private String name;
private String address;
private String phNo;
private Set<Professor> professors;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhNo() {
return phNo;
}
public void setPhNo(String phNo) {
this.phNo = phNo;
}
public Set<Professor> getProfessors() {
return professors;
}
public void setProfessors(Set<Professor> professors) {
this.professors = professors;
}
}
Functionalities:
Create Student and Professor:
public void createProfessorStudent() {
Professor professor = new Professor();
professor.setName("Gautham");
professor.setPhNo("3144143141");
professor.setDob(new Date());
Set<Student> students = new HashSet<Student>();
Student student = new Student();
student.setId(5);
students.add(student);
student = new Student();
student.setName("Johny");
student.setAddress("Santa Clara");
student.setPhNo("3144443141");
students.add(student);
professor.setStudents(students);
HibernateTemplate ht = new HibernateTemplate(sessionFactory);
Session session = ht.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
session.saveOrUpdate(professor);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
session.close();
}
}
Retrieve Student with Professor:
public void getProfessorStudent() {
HibernateTemplate ht = new HibernateTemplate(sessionFactory);
DetachedCriteria criteria = DetachedCriteria.forClass(Professor.class,
"prof");
criteria.add(Restrictions.eq("prof.id", 4));
List<Professor> professors = ht.findByCriteria(criteria);
for (Professor prof : professors) {
System.out.println("PROFESSOR: " + prof.getName() + ":"
+ prof.getPhNo() + ":" + prof.getDob());
for (Student stud : prof.getStudents()) {
System.out.println("STUDENT: " + stud.getName() + ":"
+ stud.getPhNo());
}
}
}