As we all know Hibernate is an easy and fast framework for work with any Database using Java language. This example show how to work with Many-To-One relationship in Hibernate.
I have used MySQL as database (Download Here) and Hibernate 3 jar files (Download Here). Also for applying Many-To-One relation we have used annotation. Even you can do this by using .xml config also, but that's too old and no one is using that now-a-days.
Create table department and employee :-
Table department :
Table employee :
hibernate.cnf.xml
In this hibernate.cnf.xml file we have configure the initial setup for db , and it will help us to interact with db using hibernate.
Department.java
@Entity - This annotation will help you to define entity in RDBMS.
@Table - This annotation will help you to define a database table (entity) by specifying name.
@Id - This annotation will help you to define the id column , it means the primary key.
@Column - This annotation will help you to define the column name by specifying the column name. If your column name and java variable name are different the you can specify by name. In this example our database column name and variable name are same so, not required specify the column name. Hibernate will automatically match and take care this. But I have used because for better understanding.
Employee.java
Here Employee.java is the entity class which we are going to persist or save into db along with Department.We have used few more new annotations here like @ManyToOne , @JoinColumn, etc.
Here we have mapped many-to-one , means many employee from one department.
@ManyToOne - Mapping many-to-one relation with hibernate.
@JoinColumn - This annotation is used for map the reference foreign key for any entity. This indicates the association with entity/table.
CreateSessionFactory.java
This class will help to create the SessionFactory object using .xml config file. This class having static method with we can call from any part of this application for getting SessionFactory object.Because , we will create Session object from SessionFactory.
MainClass.java
This MainClass.java is the starting point of this example. Here we will execute our hibernate Many-to-One example and it will persist the data into DB.
Hibernate Generated SQL :-
Result in DB :-
Department Table
Employee Table
I have used MySQL as database (Download Here) and Hibernate 3 jar files (Download Here). Also for applying Many-To-One relation we have used annotation. Even you can do this by using .xml config also, but that's too old and no one is using that now-a-days.
Create table department and employee :-
Table department :
CREATE TABLE `department` (
`deptid` int(11) NOT NULL,
`deptname` varchar(100) default NULL,
PRIMARY KEY (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=big5;
Table employee :
CREATE TABLE `employee` (In this above both table , many employee could be from one department and implements Many-to-One relationship.
`empid` int(11) NOT NULL,
`empname` varchar(50) default NULL,
`deptno` int(11) default NULL,
PRIMARY KEY (`empid`),
KEY `deptno` (`deptno`),
CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `department` (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=big5;
hibernate.cnf.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Adding mysql dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- Here jdeveloperguidedb is the database name -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jdeveloperguidedb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- show_sql property will help you to show the generated hibernate query on console -->
<property name="show_sql" >true</property>
<!-- Mapping entity class to hibernate -->
<mapping class="com.jdeveloperguide.lab.Employee"></mapping>
<mapping class="com.jdeveloperguide.lab.Department"></mapping>
</session-factory>
</hibernate-configuration>
In this hibernate.cnf.xml file we have configure the initial setup for db , and it will help us to interact with db using hibernate.
Department.java
package com.jdeveloperguide.lab;Here Department.java is the entity class which we are going to persist or save into db.We have used few annotation here like @Entity ,@Table , @Id , @Column , etc. This entity class looks like a helper class.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="department")
public class Department {
@Id
@Column(name="deptid")
private int deptid;
private String deptname;
public int getDeptid() {
return deptid;
}
public void setDeptid(int deptid) {
this.deptid = deptid;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
}
@Entity - This annotation will help you to define entity in RDBMS.
@Table - This annotation will help you to define a database table (entity) by specifying name.
i.e. @Table(name="department").
@Id - This annotation will help you to define the id column , it means the primary key.
@Column - This annotation will help you to define the column name by specifying the column name. If your column name and java variable name are different the you can specify by name. In this example our database column name and variable name are same so, not required specify the column name. Hibernate will automatically match and take care this. But I have used because for better understanding.
Employee.java
package com.jdeveloperguide.lab;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="employee")
public class Employee {
@Id
@Column(name="empid")
private int empid;
@Column(name="empname")
private String empname;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="deptno")
private Department dept;
public int getEmpid() {
return empid;
}
public void setEmpid(int empid) {
this.empid = empid;
}
public String getEmpname() {
return empname;
}
public void setEmpname(String empname) {
this.empname = empname;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
Here Employee.java is the entity class which we are going to persist or save into db along with Department.We have used few more new annotations here like @ManyToOne , @JoinColumn, etc.
Here we have mapped many-to-one , means many employee from one department.
@ManyToOne - Mapping many-to-one relation with hibernate.
@JoinColumn - This annotation is used for map the reference foreign key for any entity. This indicates the association with entity/table.
CreateSessionFactory.java
package com.jdeveloperguide.lab;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class CreateSessionFactory {
//Single point of access for SessionFactory
private static final SessionFactory sessionFactory;
static {
try {
//create sesson factory using the config file
sessionFactory = new AnnotationConfiguration().configure("hibernate.cnf.xml").buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
//Static method for exposing the session
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
This class will help to create the SessionFactory object using .xml config file. This class having static method with we can call from any part of this application for getting SessionFactory object.Because , we will create Session object from SessionFactory.
MainClass.java
package com.jdeveloperguide.lab;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
MainClass mainObject=new MainClass();;
Employee employee=new Employee();
Department department=new Department();
department.setDeptid(7);
department.setDeptname("Computer Science");
employee.setDept(department);
employee.setEmpid(8);
employee.setEmpname("Mr. JDeveloper");
mainObject.saveEmployee(employee);
}
public void saveEmployee(Employee employee)throws Exception{
Transaction transaction=null;
Session session=null;
try{
//Create and open session
session = CreateSessionFactory.getSessionFactory().openSession();
//Create Transaction for maintain a user session
transaction=session.beginTransaction();
//Save the employee
//Also it will save department ,because we have used cascade=CascadeType.ALL in employee
session.save(employee);
transaction.commit();
}catch(HibernateException hibernateException){
transaction.rollback();
System.out.println("Error during save into DB :::"+hibernateException);
}finally{
session.close();
}
}
}
This MainClass.java is the starting point of this example. Here we will execute our hibernate Many-to-One example and it will persist the data into DB.
Hibernate Generated SQL :-
Hibernate: select department_.deptid, department_.deptname as deptname1_ from department department_ where department_.deptid=?When we will execute the MainClass.java class , it will generate these above queries by hibernate and these are auto generated. Its generating and showing because, we have mentioned in .xml config file show_sql is true.
Hibernate: insert into department (deptname, deptid) values (?, ?)
Hibernate: insert into employee (empname, deptno, empid) values (?, ?, ?)
Result in DB :-
Department Table
Employee Table
Hope it will help you. | ||||||||||
No comments:
Post a Comment