Hibernate Join Example
Join statements are used when one wants to fetch data from multiple tables of database. Hibernate provides support for join statements where one can write single query to fetch data from multiple tables easily. Hibernate is one of the few JPA (Java Persistence API) providers. Hibernate is extensively used for persistence layer of building an enterprise application. We will show an example where we will fetch data from multiple tables.
1. Introduction
In this post, we will be showing how to use a JOIN statement in hibernate to fetch data from multiple entities which will be mapped to respective databases.
2. Environment
- Windows 7
- Java version 7
- Eclipse Kepler 4.3
- Maven 3.0.4
- MySQL 5.0.86
- JBoss-Hibernate Plugin 4.1.2
3. Example Outline
We will create a maven project, add the required dependencies, add entity classes, create a test program to describe join example with hibernate.
4. Example
Following is a step by step guide to show hibernate join statement.
4.1 Create a Maven project
Create a new maven project in eclipse. Fill in the details for GroupId
as com.javacodegeeks.example
and ArtifactId
as HibernateJoinExample
.
4.2 Add Hibernate Dependencies
Let’s add hibernate dependencies in pom.xml so we can use hibernate.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javacodegeeks.example</groupId> <artifactId>HibernateJoinExample</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> </dependency> </dependencies> </project>
4.3 Create Hibernate Configuration File
Now we will create a Hibernate configuration file hibernate.cfg.xml
under resources directory in our maven project. The hibernate wizard will look like below:
When you create hibernate configuration xml file, check the checkbox for “Create a console configuration”. The file will look like below:
hibernate.cfg.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> <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hbtutorial</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> </session-factory> </hibernate-configuration>
4.4 Create entities
In this example, we will be reading all the employees which belong to Marketing department. So we will establish relationship between two entities Employee
and Department
.
Employee.java
package com.javacodegeeks.example; public class Employee { private Long id; private String firstname; private String lastname; private Department department; public Employee() { } public Employee(String firstname, String lastname) { this.setFirstname(firstname); this.setLastname(lastname); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
Department.java
package com.javacodegeeks.example; import java.util.Set; public class Department { private Long id; private String departmentName; private Set employees; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDepartmentName() { return departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } public Set getEmployees() { return employees; } public void setEmployees(Set employees) { this.employees = employees; } }
4.5 Map Java objects to database
We will create a mapping file for each java object to database. In eclipse, under src > main > resources, create a file with option Hibernate XML Mapping file (hbm.xml). We will create Employee.hbm.xml
and Department.hbm.xml
Employee.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"> <!-- Generated Dec 5, 2016 12:36:38 AM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.javacodegeeks.example.Employee" table="EMPLOYEE"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="assigned" /> </id> <property name="firstname" type="java.lang.String"> <column name="FIRSTNAME" /> </property> <property name="lastname" type="java.lang.String"> <column name="LASTNAME" /> </property> <many-to-one name="department" class="com.javacodegeeks.example.Department" fetch="join"> <column name="DEPARTMENT_ID" /> </many-to-one> </class> </hibernate-mapping>
Department.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"> <!-- Generated Dec 5, 2016 12:36:38 AM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.javacodegeeks.example.Department" table="DEPARTMENT"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="assigned" /> </id> <property name="departmentName" type="java.lang.String"> <column name="DEPT_NAME" /> </property> <set name="employees" table="EMPLOYEE" inverse="false" lazy="true"> <key> <column name="DEPARTMENT_ID" /> </key> <one-to-many class="com.javacodegeeks.example.Employee"/> </set> </class> </hibernate-mapping>
4.6 Hibernate Test Program
Following we show a test program to read data from table. The query we are trying to perform through hibernate is to read all employees of “Marketing” department.
HibernateTestProgram.java
package com.javacodegeeks.example; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateTestProgram { private static SessionFactory factory; private static ServiceRegistry serviceRegistry; public static void main(String[] args) { // TODO Auto-generated method stub Configuration config = new Configuration(); config.configure(); config.addAnnotatedClass(Department.class); config.addResource("Department.hbm.xml"); config.addAnnotatedClass(Employee.class); config.addResource("Employee.hbm.xml"); serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build(); factory = config.buildSessionFactory(serviceRegistry); HibernateTestProgram hbp = new HibernateTestProgram(); List marketingEmployees = hbp.readMarketingEmployees(); System.out.println(" List of Employees from Marketing Department are : " ); for(int i = 0; i < marketingEmployees.size(); i++) { Employee e = marketingEmployees.get(i); System.out.println(e.getFirstname() + " " + e.getLastname()); } } private List readMarketingEmployees() { // Read all employees which belong to Marketing department String hql = "FROM Employee where department.departmentName like :dept_name"; Session session = factory.openSession(); Query query = session.createQuery(hql); query.setParameter("dept_name", "Marketing"); List listResult = query.list(); return listResult; } }
In this program, there is a method readMarketingEmployees
, in which we have shown an example of hibernate join.
String hql = "From Employee where department.departmentName like:dept_name"
. This statement shows an implicit join statement which is by default an inner join. The statement is an inner join on dept_id
as Employee
object has department
as foreign key.
If you run this program, the output will be like below:
5. Conclusion
In this example, we showed how to use hibernate to read data from multiple database tables using Hibernate Join statement.
6. Download
The source code for this example is packages in a zip file to download.
You can download the full source code of this example here: hibernatejoinexample
SQL for creating the tables please?