SlideShare a Scribd company logo
Hibernate Tutorial
HIBERNATE TUTORIAL
Simply Easy Learning by tutorialspoint.com
tutorialspoint.com
TUTORIALS POINT
Simply Easy Learning
ABOUT THE TUTORIAL
Hibernate Tutorial
Hibernate is a high-performance Object/Relational persistence and query service which is licensed under the
open source GNU Lesser General Public License (LGPL) and is free to download. Hibernate not only takes care
of the mapping from Java classes to database tables (and from Java data types to SQL data types), but also
provides data query and retrieval facilities.
This tutorial will teach you how to use Hibernate to develop your database based web applications in simple and
easy steps.
Audience
This tutorial is designed for Java programmers with a need to understand the Hibernate framework and API. After
completing this tutorial you will find yourself at a moderate level of expertise in using Hibernate from where you
can take yourself to next levels.
Prerequisites
We assume you have good understanding of the Java programming language. A basic understanding of
relational databases, JDBC and SQL is very helpful.
Copyright & Disclaimer Notice
 All the content and graphics on this tutorial are the property of tutorialspoint.com. Any content from
tutorialspoint.com or this tutorial may not be redistributed or reproduced in any way, shape, or form
without the written permission of tutorialspoint.com. Failure to do so is a violation of copyright laws.
This tutorial may contain inaccuracies or errors and tutorialspoint provides no guarantee regarding the
accuracy of the site or its contents including this tutorial. If you discover that the tutorialspoint.com site
or this tutorial content contains some errors, please contact us at webmaster@tutorialspoint.com
TUTORIALS POINT
Simply Easy Learning
Table of Content
Hibernate Tutorial .................................................................... 2
Audience.................................................................................. 2
Prerequisites............................................................................ 2
Copyright & Disclaimer Notice.................................................. 2
ORM Overview......................................................................... 8
Pros and Cons of JDBC...................................................................................8
Why Object Relational Mapping (ORM)?.........................................................8
What is ORM? ..............................................................................................9
Java ORM Frameworks................................................................................10
Hibernate Overview ............................................................... 11
Hibernate Advantages.................................................................................11
Supported Databases..................................................................................12
Supported Technologies..............................................................................12
Hibernate Architecture ........................................................... 13
Configuration Object...................................................................................14
SessionFactory Object .................................................................................14
Session Object............................................................................................15
Transaction Object......................................................................................15
Query Object..............................................................................................15
Criteria Object............................................................................................15
Hibernate Environment .......................................................... 16
Downloading Hibernate:..............................................................................16
Installing Hibernate.....................................................................................17
Hibernate Prerequisites...............................................................................17
Hibernate Configuration ......................................................... 18
Hibernate Properties...................................................................................18
Hibernate with MySQL Database..................................................................19
Hibernate Sessions................................................................ 21
Session Interface Methods ..........................................................................22
Hibernate Persistent Class..................................................... 24
A simple POJO example:..............................................................................24
Hibernate Mapping Files ........................................................ 26
Hibernate Mapping Types ...................................................... 29
Primitive types ...........................................................................................29
Date and time types....................................................................................29
Binary and large object types.......................................................................30
JDK-related types........................................................................................30
TUTORIALS POINT
Simply Easy Learning
Hibernate Examples............................................................... 31
Create POJO Classes....................................................................................31
Create Database Tables...............................................................................32
Create Mapping Configuration File ...............................................................32
Create Application Class ..............................................................................33
Compilation and Execution ..........................................................................35
Hibernate O/R Mapping ......................................................... 36
Collections Mappings ............................................................................36
Hibernate Set Mappings..............................................................................36
Define RDBMS Tables ................................................................................37
Define POJO Classes...................................................................................37
Define Hibernate Mapping File ..................................................................39
Create Application Class ............................................................................40
Compilation and Execution........................................................................42
Hibernate SortedSet Mappings ....................................................................43
Define RDBMS Tables ................................................................................43
Define POJO Classes...................................................................................44
Define Hibernate Mapping File ..................................................................45
Create Application Class ............................................................................47
Compilation and Execution........................................................................49
Hibernate List Mappings..............................................................................50
Define RDBMS Tables ................................................................................50
Define POJO Classes...................................................................................51
Define Hibernate Mapping File ..................................................................52
Create Application Class ............................................................................53
Compilation and Execution........................................................................55
Hibernate Bag Mappings .............................................................................57
Define RDBMS Tables ................................................................................57
Define POJO Classes...................................................................................57
Define Hibernate Mapping File ..................................................................58
Create Application Class ............................................................................60
Compilation and Execution........................................................................62
Hibernate Map Mappings ............................................................................63
Define RDBMS Tables ................................................................................63
Define POJO Classes...................................................................................63
Define Hibernate Mapping File ..................................................................65
Create Application Class ............................................................................66
Compilation and Execution........................................................................68
Hibernate SortedMap Mappings ..................................................................69
TUTORIALS POINT
Simply Easy Learning
Define RDBMS Tables ................................................................................69
Define POJO Classes...................................................................................70
Define Hibernate Mapping File ..................................................................71
Compilation and Execution........................................................................75
Association Mappings ...........................................................................76
Hibernate Many-to-One Mappings ...............................................................76
Define RDBMS Tables ................................................................................76
Define POJO Classes...................................................................................77
Define Hibernate Mapping File ..................................................................79
Compilation and Execution........................................................................82
Hibernate One-to-One Mappings .................................................................83
Define RDBMS Tables ................................................................................83
Define POJO Classes...................................................................................84
Define Hibernate Mapping File ..................................................................86
Compilation and Execution........................................................................89
Hibernate One-to-Many Mappings ...............................................................90
Define RDBMS Tables ................................................................................90
Define POJO Classes...................................................................................91
Define Hibernate Mapping File ..................................................................92
Create Application Class ............................................................................93
Compilation and Execution........................................................................95
Hibernate Many-to-Many Mappings.............................................................96
Define RDBMS Tables ................................................................................97
Define POJO Classes...................................................................................97
Define Hibernate Mapping File ..................................................................99
Create Application Class ..........................................................................100
Compilation and Execution......................................................................102
Component Mappings...............................................................................103
Hibernate Component Mappings................................................................103
Define RDBMS Tables ..............................................................................103
Define POJO Classes.................................................................................104
Define Hibernate Mapping File ................................................................106
Create Application Class ..........................................................................107
Compilation and Execution......................................................................109
Hibernate Annotations.......................................................... 111
Environment Setup for Hibernate Annotation..............................................111
Annotated Class Example ..........................................................................111
@Entity Annotation ..................................................................................112
@Table Annotation...................................................................................113
TUTORIALS POINT
Simply Easy Learning
@Id and @GeneratedValue Annotations.....................................................113
@Column Annotation ...............................................................................113
Create Application Class ............................................................................113
Database Configuration.............................................................................115
Compilation and Execution ........................................................................116
Hibernate Query Language.................................................. 117
FROM Clause............................................................................................117
AS Clause.................................................................................................117
SELECT Clause ..........................................................................................118
WHERE Clause..........................................................................................118
ORDER BY Clause ......................................................................................118
GROUP BY Clause......................................................................................118
Using Named Paramters............................................................................119
UPDATE Clause.........................................................................................119
DELETE Clause ..........................................................................................119
INSERT Clause ..........................................................................................119
Aggregate Methods ..................................................................................119
Pagination using Query .............................................................................120
Hibernate Criteria Queries ................................................... 121
Restrictions with Criteria ...........................................................................121
Pagination using Criteria............................................................................122
Sorting the Results....................................................................................123
Projections & Aggregations........................................................................123
Criteria Queries Example ...........................................................................123
Compilation and Execution ........................................................................127
Hibernate Native SQL .......................................................... 128
Scalar queries...........................................................................................128
Entity queries...........................................................................................128
Named SQL queries...................................................................................129
Native SQL Example ..................................................................................129
Compilation and Execution ........................................................................132
Hibernate Caching ............................................................... 133
First-level cache........................................................................................133
Second-level cache ...................................................................................134
Query-level cache.....................................................................................134
The Second Level Cache ............................................................................134
Concurrency strategies..............................................................................134
Cache provider .........................................................................................135
The Query-level Cache ..............................................................................137
TUTORIALS POINT
Simply Easy Learning
Hibernate Batch Processing................................................. 138
Batch Processing Example .........................................................................139
Compilation and Execution ........................................................................142
Hibernate Interceptors.......................................................... 143
How to use Interceptors? ..........................................................................144
Create Interceptors...................................................................................144
Create POJO Classes..................................................................................145
Create Database Tables.............................................................................145
Create Mapping Configuration File .............................................................146
Create Application Class ............................................................................146
Compilation and Execution ........................................................................148
TUTORIALS POINT
Simply Easy Learning
ORM Overview
JDBC stands for Java Database Connectivity and provides a set of Java API for accessing the relational
databases from Java program. These Java APIs enables Java programs to execute SQL statements and interact
with any SQL compliant database.
JDBC provides a flexible architecture to write a database independent application that can run on different
platforms and interact with different DBMS without any modification.
Pros and Cons of JDBC
Pros of JDBC Cons of JDBC
 Clean and simple SQL processing
 Good performance with large data
 Very good for small applications
 Simple syntax so easy to learn
 Complex if it is used in large projects
 Large programming overhead
 No encapsulation
 Hard to implement MVC concept
 Query is DBMS specific
Why Object Relational Mapping (ORM)?
When we work with an object-oriented systems, there's a mismatch between the object model and the relational
database. RDBMSs represent data in a tabular format whereas object-oriented languages, such as Java or C#
represent it as an interconnected graph of objects. Consider the following Java Class with proper constructors and
associated public function:
public class Employee {
private int id;
private String first_name;
private String last_name;
private int salary;
CHAPTER
1
TUTORIALS POINT
Simply Easy Learning
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.first_name = fname;
this.last_name = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
public int getSalary() {
return salary;
}
}
Consider above objects need to be stored and retrieved into the following RDBMS table:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
First problem, what if we need to modify the design of our database after having developed few pages or our
application? Second, Loading and storing objects in a relational database exposes us to the following five
mismatch problems.
Mismatch Description
Granularity
Sometimes you will have an object model which has more classes than the
number of corresponding tables in the database.
Inheritance
RDBMSs do not define anything similar to Inheritance which is a natural paradigm
in object-oriented programming languages.
Identity
A RDBMS defines exactly one notion of 'sameness': the primary key. Java,
however, defines both object identity (a==b) and object equality (a.equals(b)).
Associations
Object-oriented languages represent associations using object references where
as am RDBMS represents an association as a foreign key column.
Navigation The ways you access objects in Java and in a RDBMS are fundamentally different.
The Object-Relational Mapping (ORM) is the solution to handle all the above impedance mismatches.
What is ORM?
ORM stands for Object-Relational Mapping (ORM) is a programming technique for converting data between
relational databases and object oriented programming languages such as Java, C# etc. An ORM system has
following advantages over plain JDBC
TUTORIALS POINT
Simply Easy Learning
S.N. Advantages
1 Lets business code access objects rather than DB tables.
2 Hides details of SQL queries from OO logic.
3 Based on JDBC 'under the hood'
4 No need to deal with the database implementation.
5 Entities based on business concepts rather than database structure.
6 Transaction management and automatic key generation.
7 Fast development of application.
An ORM solution consists of the following four entities:
S.N. Solutions
1 An API to perform basic CRUD operations on objects of persistent classes.
2 A language or API to specify queries that refer to classes and properties of classes.
3 A configurable facility for specifying mapping metadata.
4
A technique to interact with transactional objects to perform dirty checking, lazy association
fetching, and other optimization functions.
Java ORM Frameworks
There are several persistent frameworks and ORM options in Java. A persistent framework is an ORM service that
stores and retrieves objects into a relational database.
 Enterprise JavaBeans Entity Beans
 Java Data Objects
 Castor
 TopLink
 Spring DAO
 Hibernate
 And many more
TUTORIALS POINT
Simply Easy Learning
Hibernate Overview
Hibernate is an Object-Relational Mapping(ORM) solution for JAVA and it raised as an open source
persistent framework created by Gavin King in 2001. It is a powerful, high performance Object-Relational
Persistence and Query service for any Java Application.
Hibernate maps Java classes to database tables and from Java data types to SQL data types and relieve the
developer from 95% of common data persistence related programming tasks.
Hibernate sits between traditional Java objects and database server to handle all the work in persisting those
objects based on the appropriate O/R mechanisms and patterns.
Hibernate Advantages
 Hibernate takes care of mapping Java classes to database tables using XML files and without writing
any line of code.
 Provides simple APIs for storing and retrieving Java objects directly to and from the database.
 If there is change in Database or in any table then the only need to change XML file properties.
 Abstract away the unfamiliar SQL types and provide us to work around familiar Java Objects.
 Hibernate does not require an application server to operate.
 Manipulates Complex associations of objects of your database.
CHAPTER
2
TUTORIALS POINT
Simply Easy Learning
 Minimize database access with smart fetching strategies.
 Provides Simple querying of data.
Supported Databases
Hibernate supports almost all the major RDBMS. Following is list of few of the database engines supported by
Hibernate.
 HSQL Database Engine
 DB2/NT
 MySQL
 PostgreSQL
 FrontBase
 Oracle
 Microsoft SQL Server Database
 Sybase SQL Server
 Informix Dynamic Server
Supported Technologies
Hibernate supports a variety of other technologies, including the following:
 XDoclet Spring
 J2EE
 Eclipse plug-ins
 Maven
TUTORIALS POINT
Simply Easy Learning
Hibernate Architecture
The Hibernate architecture is layered to keep you isolated from having to know the underlying APIs.
Hibernate makes use of the database and configuration data to provide persistence services (and persistent
objects) to the application.
Following is a very high level view of the Hibernate Application Architecture.
Following is a detailed view of the Hibernate Application Architecture with few important core classes.
CHAPTER
3
TUTORIALS POINT
Simply Easy Learning
Hibernate uses various existing Java APIs, like JDBC, Java Transaction API(JTA), and Java Naming and
Directory Interface (JNDI). JDBC provides a rudimentary level of abstraction of functionality common to relational
databases, allowing almost any database with a JDBC driver to be supported by Hibernate. JNDI and JTA allow
Hibernate to be integrated with J2EE application servers.
Following section gives brief description of each of the class objects involved in Hibernate Application
Architecture.
Configuration Object
The Configuration object is the first Hibernate object you create in any Hibernate application and usually created
only once during application initialization. It represents a configuration or properties file required by the Hibernate.
The Configuration object provides two keys components:
 Database Connection: This is handled through one or more configuration files supported by Hibernate.
These files are hibernate.properties and hibernate.cfg.xml.
 Class Mapping Setup: This component creates the connection between the Java classes and database
tables.
SessionFactory Object
Configuration object is used to create a SessionFactory object which inturn configures Hibernate for the
application using the supplied configuration file and allows for a Session object to be instantiated. The
SessionFactory is a thread safe object and used by all the threads of an application.
TUTORIALS POINT
Simply Easy Learning
The SessionFactory is heavyweight object so usually it is created during application start up and kept for later
use. You would need one SessionFactory object per database using a separate configuration file. So if you are
using multiple databases then you would have to create multiple SessionFactory objects.
Session Object
A Session is used to get a physical connection with a database. The Session object is lightweight and designed to
be instantiated each time an interaction is needed with the database. Persistent objects are saved and retrieved
through a Session object.
The session objects should not be kept open for a long time because they are not usually thread safe and they
should be created and destroyed them as needed.
Transaction Object
A Transaction represents a unit of work with the database and most of the RDBMS supports transaction
functionality. Transactions in Hibernate are handled by an underlying transaction manager and transaction (from
JDBC or JTA).
This is an optional object and Hibernate applications may choose not to use this interface, instead managing
transactions in their own application code.
Query Object
Query objects use SQL or Hibernate Query Language (HQL) string to retrieve data from the database and create
objects. A Query instance is used to bind query parameters, limit the number of results returned by the query, and
finally to execute the query.
Criteria Object
Criteria object are used to create and execute object oriented criteria queries to retrieve objects.
TUTORIALS POINT
Simply Easy Learning
Hibernate Environment
This chapter will explain how to install Hibernate and other associated packages to prepare a develop
environment for the Hibernate applications. We will work with MySQL database to experiment with Hibernate
examples, so make sure you already have setup for MySQL database. For a more detail on MySQL you can
check our MySQL Tutorial.
Downloading Hibernate:
It is assumed that you already have latest version of Java is installed on your machine. Following are the simple
steps to download and install Hibernate on your machine.
 Make a choice whether you want to install Hibernate on Windows, or Unix and then proceed to the next
step to download .zip file for windows and .tz file for Unix.
 Download the latest version of Hibernate from http://www.hibernate.org/downloads.
 At the time of writing this tutorial I downloaded hibernate-distribution-3.6.4.Final and when you unzip
the downloaded file it will give you directory structure as follows.
CHAPTER
4
TUTORIALS POINT
Simply Easy Learning
Installing Hibernate
Once you downloaded and unzipped the latest version of the Hibernate Installation file, you need to perform
following two simple steps. Make sure you are setting your CLASSPATH variable properly otherwise you will face
problem while compiling your application.
 Now copy all the library files from /lib into your CLASSPATH, and change your classpath variable to
include all the JARs:
 Finally copy hibernate3.jar file into your CLASSPATH. This file lies in the root directory of the
installation and is the primary JAR that Hibernate needs to do its work.
Hibernate Prerequisites
Following is the list of the packages/libraries required by Hibernate and you should install them before starting
with Hibernate. To install these packages you would have to copy library files from /lib into your CLASSPATH,
and change your CLASSPATH variable accordingly.
S.N. Packages/Libraries
1 dom4j - XML parsing www.dom4j.org/
2 Xalan - XSLT Processor http://xml.apache.org/xalan-j/
3 Xerces - The Xerces Java Parser http://xml.apache.org/xerces-j/
4 cglib - Appropriate changes to Java classes at runtime http://cglib.sourceforge.net/
5 log4j - Logging Faremwork http://logging.apache.org/log4j
6 Commons - Logging, Email etc. http://jakarta.apache.org/commons
7 SLF4J - Logging Facade for Java http://www.slf4j.org
TUTORIALS POINT
Simply Easy Learning
Hibernate Configuration
Hibernate requires to know in advance where to find the mapping information that defines how your Java
classes relate to the database tables. Hibernate also requires a set of configuration settings related to database
and other related parameters. All such information is usually supplied as a standard Java properties file
called hibernate.properties, or as an XML file named hibernate.cfg.xml.
I will consider XML formatted file hibernate.cfg.xml to specify required Hibernate properties in my examples.
Most of the properties take their default values and it is not required to specify them in the property file unless it is
really required. This file is kept in the root directory of your application's classpath.
Hibernate Properties
Following is the list of important properties you would require to configure for a databases in a standalone
situation:
S.N. Properties and Description
1
hibernate.dialect
This property makes Hibernate generate the appropriate SQL for the chosen database.
2
hibernate.connection.driver_class
The JDBC driver class.
3
hibernate.connection.url
The JDBC URL to the database instance.
4
hibernate.connection.username
The database username.
5
hibernate.connection.password
The database password.
6
hibernate.connection.pool_size
Limits the number of connections waiting in the Hibernate database connection pool.
7
hibernate.connection.autocommit
Allows autocommit mode to be used for the JDBC connection.
If you are using a database along with an application server and JNDI then you would have to configure the
following properties:
CHAPTER
5
TUTORIALS POINT
Simply Easy Learning
S.N. Properties and Description
1
hibernate.connection.datasource
The JNDI name defined in the application server context you are using for the application.
2
hibernate.jndi.class
The InitialContext class for JNDI.
3
hibernate.jndi.<JNDIpropertyname>
Passes any JNDI property you like to the JNDI InitialContext.
4
hibernate.jndi.url
Provides the URL for JNDI.
5
hibernate.connection.username
The database username.
6
hibernate.connection.password
The database password.
Hibernate with MySQL Database
MySQL is one of the most popular open-source database systems available today. Let us
createhibernate.cfg.xml configuration file and place it in the root of your application's classpath. You would have
to make sure that you have testdb database available in your MySQL database and you have a
user test available to access the database.
The XML configuration file must conform to the Hibernate 3 Configuration DTD, which is available from
http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume test is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root123
</property>
<!-- List of XML mapping files -->
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
TUTORIALS POINT
Simply Easy Learning
The above configuration file includes <mapping> tags which are related to hibernate-mapping file and we will see
in next chapter what exactly is a hibernate mapping file and how and why do we use it. Following is the list of
various important databases dialect property type:
Database Dialect Property
DB2 org.hibernate.dialect.DB2Dialect
HSQLDB org.hibernate.dialect.HSQLDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Informix org.hibernate.dialect.InformixDialect
Ingres org.hibernate.dialect.IngresDialect
Interbase org.hibernate.dialect.InterbaseDialect
Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect
MySQL org.hibernate.dialect.MySQLDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 11g org.hibernate.dialect.Oracle10gDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
Progress org.hibernate.dialect.ProgressDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Serial No Class Name Functionality
1 Assert A set of assert methods.
2 TestCase A test case defines the fixture to run multiple tests.
3 TestResult
A TestResult collects the results of executing a
test case.
4 TestSuite A TestSuite is a Composite of Tests.
TUTORIALS POINT
Simply Easy Learning
Hibernate Sessions
ASession is used to get a physical connection with a database. The Session object is lightweight and
designed to be instantiated each time an interaction is needed with the database. Persistent objects are saved
and retrieved through a Session object.
The session objects should not be kept open for a long time because they are not usually thread safe and they
should be created and destroyed them as needed. The main function of the Session is to offer create, read and
delete operations for instances of mapped entity classes. Instances may exist in one of the following three states
at a given point in time:
 transient: A new instance of a a persistent class which is not associated with a Session and has no
representation in the database and no identifier value is considered transient by Hibernate.
 persistent: You can make a transient instance persistent by associating it with a Session. A persistent
instance has a representation in the database, an identifier value and is associated with a Session.
 detached: Once we close the Hibernate Session, the persistent instance will become a detached
instance.
A Session instance is serializable if its persistent classes are serializable. A typical transaction should use the
following idiom:
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
If the Session throws an exception, the transaction must be rolled back and the session must be discarded.
CHAPTER
6
TUTORIALS POINT
Simply Easy Learning
Session Interface Methods
There are number of methods provided by the Session interface but I'm going to list down few important methods
only, which we will use in this tutorial. You can check Hibernate documentation for a complete list of methods
associated with Session and SessionFactory.
S.N. Session Methods and Description
1
Transaction beginTransaction()
Begin a unit of work and return the associated Transaction object.
2
void cancelQuery()
Cancel the execution of the current query.
3
void clear()
Completely clear the session.
4
Connection close()
End the session by releasing the JDBC connection and cleaning up.
5
Criteria createCriteria(Class persistentClass)
Create a new Criteria instance, for the given entity class, or a superclass of an entity class.
6
Criteria createCriteria(String entityName)
Create a new Criteria instance, for the given entity name.
7
Serializable getIdentifier(Object object)
Return the identifier value of the given entity as associated with this session.
8
Query createFilter(Object collection, String queryString)
Create a new instance of Query for the given collection and filter string.
9
Query createQuery(String queryString)
Create a new instance of Query for the given HQL query string.
10
SQLQuery createSQLQuery(String queryString)
Create a new instance of SQLQuery for the given SQL query string.
11
void delete(Object object)
Remove a persistent instance from the datastore.
12
void delete(String entityName, Object object)
Remove a persistent instance from the datastore.
13
Session get(String entityName, Serializable id)
Return the persistent instance of the given named entity with the given identifier, or null if
there is no such persistent instance.
14
SessionFactory getSessionFactory()
Get the session factory which created this session.
15
void refresh(Object object)
Re-read the state of the given instance from the underlying database.
16
Transaction getTransaction()
Get the Transaction instance associated with this session.
17
boolean isConnected()
Check if the session is currently connected.
18
boolean isDirty()
Does this session contain any changes which must be synchronized with the database?
TUTORIALS POINT
Simply Easy Learning
19
boolean isOpen()
Check if the session is still open.
20
Serializable save(Object object)
Persist the given transient instance, first assigning a generated identifier.
21
void saveOrUpdate(Object object)
Either save(Object) or update(Object) the given instance.
22
void update(Object object)
Update the persistent instance with the identifier of the given detached instance.
23
void update(String entityName, Object object)
Update the persistent instance with the identifier of the given detached instance.
TUTORIALS POINT
Simply Easy Learning
Hibernate Persistent Class
The entire concept of Hibernate is to take the values from Java class attributes and persist them to a
database table. A mapping document helps Hibernate in determining how to pull the values from the classes and
map them with table and associated fields.
Java classes whose objects or instances will be stored in database tables are called persistent classes in
Hibernate. Hibernate works best if these classes follow some simple rules, also known as the Plain Old Java
Object (POJO) programming model. There are following main rules of persistent classes, however, none of these
rules are hard requirements.
 All Java classes that will be persisted need a default constructor.
 All classes should contain an ID in order to allow easy identification of your objects within Hibernate and
the database. This property maps to the primary key column of a database table.
 All attributes that will be persisted should be declared private and have getXXX and setXXXmethods
defined in the JavaBean style.
 A central feature of Hibernate, proxies, depends upon the persistent class being either non-final, or the
implementation of an interface that declares all public methods.
 All classes that do not extend or implement some specialized classes and interfaces required by the EJB
framework.
The POJO name is used to emphasize that a given object is an ordinary Java Object, not a special object, and in
particular not an Enterprise JavaBean.
A simple POJO example:
Based on the few rules mentioned above we can define a POJO class as follows:
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
CHAPTER
7
TUTORIALS POINT
Simply Easy Learning
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
TUTORIALS POINT
Simply Easy Learning
Hibernate Mapping Files
An Object/relational mappings are usually defined in an XML document. This mapping file instructs
Hibernate how to map the defined class or classes to the database tables.
Though many Hibernate users choose to write the XML by hand, a number of tools exist to generate the mapping
document. These include XDoclet, Middlegen and AndroMDA for advanced Hibernate users.
Let us consider our previously defined POJO class whose objects will persist in the table defined in next section.
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
CHAPTER
8
TUTORIALS POINT
Simply Easy Learning
public void setSalary( int salary ) {
this.salary = salary;
}
}
There would be one table corresponding to each object you are willing to provide persistence. Consider above
objects need to be stored and retrieved into the following RDBMS table:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Based on the two above entities we can define following mapping file which instructs Hibernate how to map the
defined class or classes to the database tables.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. Let us see little detail about the mapping elements used in the mapping
file:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains all the <class> elements.
 The <class> elements are used to define specific mappings from a Java classes to the database tables.
The Java class name is specified using the name attribute of the class element and the database table
name is specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to
the column in the database table. The type attribute holds the hibernate mapping type, this mapping
types will convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key
values. Set the class attribute of the generator element is set to native to let hibernate pick up
TUTORIALS POINT
Simply Easy Learning
either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the
underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to
the column in the database table. The type attribute holds the hibernate mapping type, this mapping
types will convert from Java to SQL data type.
There are other attributes and elements available which will be used in a mapping document and I would try to
cover as many as possible while discussing other Hibernate related topics.
TUTORIALS POINT
Simply Easy Learning
Hibernate Mapping Types
When you prepare a Hibernate mapping document, we have seen that you map Java data types into
RDBMS data types. The types declared and used in the mapping files are not Java data types; they are not SQL
database types either. These types are called Hibernate mapping types, which can translate from Java to SQL
data types and vice versa.
This chapter lists down all the basic, date and time, large object, and various other built-in mapping types.
Primitive types
Mapping type Java type ANSI SQL Type
integer int or java.lang.Integer INTEGER
long long or java.lang.Long BIGINT
short short or java.lang.Short SMALLINT
float float or java.lang.Float FLOAT
double double or java.lang.Double DOUBLE
big_decimal java.math.BigDecimal NUMERIC
character java.lang.String CHAR(1)
string java.lang.String VARCHAR
byte byte or java.lang.Byte TINYINT
boolean boolean or java.lang.Boolean BIT
yes/no boolean or java.lang.Boolean
CHAR(1) ('Y' or
'N')
true/false boolean or java.lang.Boolean
CHAR(1) ('T' or
'F')
Date and time types
Mapping type Java type ANSI SQL Type
.CHAPTER
9
TUTORIALS POINT
Simply Easy Learning
date java.util.Date or java.sql.Date DATE
time java.util.Date or java.sql.Time TIME
timestamp java.util.Date or java.sql.Timestamp TIMESTAMP
calendar java.util.Calendar TIMESTAMP
calendar_date java.util.Calendar DATE
Binary and large object types
Mapping type Java type ANSI SQL Type
binary byte[]
VARBINARY (or
BLOB)
text java.lang.String CLOB
serializable any Java class that implements java.io.Serializable
VARBINARY (or
BLOB)
clob java.sql.Clob CLOB
blob java.sql.Blob BLOB
JDK-related types
Mapping type Java type ANSI SQL Type
class java.lang.Class VARCHAR
locale java.util.Locale VARCHAR
timezone java.util.TimeZone VARCHAR
currency java.util.Currency VARCHAR
TUTORIALS POINT
Simply Easy Learning
Hibernate Examples
Let us try an example of using Hibernate to provide Java persistence in a standalone application. We will
go through different steps involved in creating Java Application using Hibernate technology.
Create POJO Classes
The first step in creating an application is to build the Java POJO class or classes, depending on the application
that will be persisted to the database. Let us consider our Employee class with getXXX andsetXXX methods to
make it JavaBeans compliant class.
A POJO (Plain Old Java Object) is a Java object that doesn't extend or implement some specialized classes and
interfaces respectively required by the EJB framework. All normal Java objects are POJO.
When you design a classs to be persisted by Hibernate, it's important to provide JavaBeans compliant code as
well as one attribute which would work as index like id attribute in the Employee class.
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
CHAPTER
10
TUTORIALS POINT
Simply Easy Learning
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Create Database Tables
Second step would be creating tables in your database. There would be one table corresponding to each object
you are willing to provide persistence. Consider above objects need to be stored and retrieved into the following
RDBMS table:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Create Mapping Configuration File
This step is to create a mapping file that instructs Hibernate how to map the defined class or classes to the
database tables.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. Let us see little detail about the mapping document:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains all the <class> elements.
TUTORIALS POINT
Simply Easy Learning
 The <class> elements are used to define specific mappings from a Java classes to the database tables.
The Java class name is specified using the name attribute of the class element and the database table
name is specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to
the column in the database table. The type attribute holds the hibernate mapping type, this mapping
types will convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key
values. Set the class attribute of the generator element is set to native to let hibernate pick up
either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the
underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to
the column in the database table. The type attribute holds the hibernate mapping type, this mapping
types will convert from Java to SQL data type.
There are other attributes and elements available which will be used in a mapping document and I would try to
cover as many as possible while discussing other Hibernate related topics.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records and then we will apply CRUD operations on those records.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
TUTORIALS POINT
Simply Easy Learning
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
TUTORIALS POINT
Simply Easy Learning
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result, and records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
If you check your EMPLOYEE table, it should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>
TUTORIALS POINT
Simply Easy Learning
Hibernate O/R Mapping
So far we have seen very basic O/R mapping using hibernate but there are three most important mapping
topics which we have to learn in detail. These are the mapping of collections, the mapping of associations
between entity classes and Component Mappings.
Collections Mappings
If an entity or class has collection of values for a particular variable, then we can map those values using any one
of the collection interfaces available in java. Hibernate can persist instances ofjava.util.Map, java.util.Set,
java.util.SortedMap, java.util.SortedSet, java.util.List, and any array of persistent entities or values.
Collection type Mapping and Description
java.util.Set This is mapped with a <set> element and initialized with java.util.HashSet
java.util.SortedSet
This is mapped with a <set> element and initialized with java.util.TreeSet.
The sort attribute can be set to either a comparator or natural ordering.
java.util.List This is mapped with a <list> element and initialized with java.util.ArrayList
java.util.Collection
This is mapped with a <bag> or <ibag> element and initialized with
java.util.ArrayList
java.util.Map
This is mapped with a <map> element and initialized with
java.util.HashMap
java.util.SortedMap
This is mapped with a <map> element and initialized with
java.util.TreeMap. The sort attribute can be set to either a comparator or
natural ordering.
Arrays are supported by Hibernate with <primitive-array> for Java primitive value types and <array> for everything
else. However, they are rarely used so I'm not going to discuss them in this tutorial.
If you want to map a user defined collection interfaces which is not directly supported by Hibernate, you need to
tell Hibernate about the semantics of your custom collections which is not very easy and not recommend to be
used.
Hibernate Set Mappings
A Set is a java collection that does not contain any duplicate element. More formally, sets contain no pair of
elements e1 and e2 such that e1.equals(e2), and at most one null element. So objects to be added to a set must
CHAPTER
11
TUTORIALS POINT
Simply Easy Learning
implement both the equals() and hashCode() methods so that Java can determine whether any two
elements/objects are identical.
A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set
collection in your class when there is no duplicate element required in the collection.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. So we will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects:
Define POJO Classes
Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in Set variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private Set certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
TUTORIALS POINT
Simply Easy Learning
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Set getCertificates() {
return certificates;
}
public void setCertificates( Set certificates ) {
this.certificates = certificates;
}
}
Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table. This class should also implement both the equals() and
hashCode() methods so that Java can determine whether any two elements/objects are identical.
public class Certificate {
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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 boolean equals(Object obj) {
if (obj == null) return false;
if (!this.getClass().equals(obj.getClass())) return false;
Certificate obj2 = (Certificate)obj;
if((this.id == obj2.getId()) && (this.name.equals(obj2.getName())))
{
return true;
}
return false;
}
public int hashCode() {
int tmp = 0;
tmp = ( id + name ).hashCode();
TUTORIALS POINT
Simply Easy Learning
return tmp;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <set> element will be used to define the rule for Set collection used.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<set name="certificates" cascade="all">
<key column="employee_id"/>
<one-to-many class="Certificate"/>
</set>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
TUTORIALS POINT
Simply Easy Learning
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <set> element is new here and has been introduced to set the relationship between Certificate and
Employee classes. We used the cascade attribute in the <set> element to tell Hibernate to persist the
Certificate objects at the same time as the Employee objects. The nameattribute is set to the
defined Set variable in the parent class, in our case it is certificates. For each set variable, we need to define a
separate set element in the mapping file.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie.
table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
HashSet set1 = new HashSet();
set1.add(new Certificate("MCA"));
set1.add(new Certificate("MBA"));
set1.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
HashSet set2 = new HashSet();
set2.add(new Certificate("BCA"));
set2.add(new Certificate("BA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
TUTORIALS POINT
Simply Easy Learning
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Set cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Set certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
TUTORIALS POINT
Simply Easy Learning
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MBA
Certificate: PMP
Certificate: MCA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MBA
Certificate: PMP
TUTORIALS POINT
Simply Easy Learning
Certificate: MCA
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from employee;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from certificate;
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
| 1 | MBA | 1 |
| 2 | PMP | 1 |
| 3 | MCA | 1 |
+----+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Hibernate SortedSet Mappings
A SortedSet is a java collection that does not contain any duplicate element and elements are ordered using their
natural ordering or by a comparator provided.
A SortedSet is mapped with a <set> element in the mapping table and initialized with java.util.TreeSet.
The sort attribute can be set to either a comparator or natural ordering. If we use natural ordering then its iterator
will traverse the set in ascending element order.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. So we will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects:
TUTORIALS POINT
Simply Easy Learning
Define POJO Classes
Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in SortedSet variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private SortedSet certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public SortedSet getCertificates() {
return certificates;
}
public void setCertificates( SortedSet certificates ) {
this.certificates = certificates;
}
}
Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table. This class should also implementComparable interface
and compareTo method which will be used to sort the elements in case you setsort="natural" in your mapping
file (see below mapping file).
public class Certificate implements Comparable <Certificate>{
TUTORIALS POINT
Simply Easy Learning
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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 int compareTo(Certificate that){
final int BEFORE = -1;
final int AFTER = 1;
if (that == null) {
return BEFORE;
}
Comparable thisCertificate = this.getName();
Comparable thatCertificate = that.getName();
if(thisCertificate == null) {
return AFTER;
} else if(thatCertificate == null) {
return BEFORE;
} else {
return thisCertificate.compareTo(thatCertificate);
}
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <set> element will be used to define the rule for SortedSet collection used.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<set name="certificates" cascade="all" sort="MyClass">
<key column="employee_id"/>
TUTORIALS POINT
Simply Easy Learning
<one-to-many class="Certificate"/>
</set>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying
database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <set> element is used to set the relationship between Certificate and Employee classes. We used
the cascade attribute in the <set> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the definedSortedSet variable in the parent class, in
our case it is certificates. The sort attribute can be set to natural to have natural sorting or it can be set to a
custom class implementingjava.util.Comparator. We have used a class MyClass which implements
java.util.Comparator to reverse the sorting order implemented in Certificate class.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object
ie. table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement.
If we use sort="natural" setting then we do not need to create a separate class because Certificate class already
has implemented Comparable interface and hibernate will use compareTo() method defined in Certificate class to
compare certificate names. But we are using a custom comparator classMyClass in our mapping file so we would
have to create this class based on our sorting algorithm. Let us do descending sorting in this class using this
class.
import java.util.Comparator;
TUTORIALS POINT
Simply Easy Learning
public class MyClass implements Comparator<Certificate>{
public int compare(Certificate o1, Certificate o2) {
final int BEFORE = -1;
final int AFTER = 1;
/* To reverse the sorting order, multiple by -1 */
if (o2 == null) {
return BEFORE * -1;
}
Comparable thisCertificate = o1.getName();
Comparable thatCertificate = o2.getName();
if(thisCertificate == null) {
return AFTER * 1;
} else if(thatCertificate == null) {
return BEFORE * -1;
} else {
return thisCertificate.compareTo(thatCertificate) * -1;
}
}
}
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
TreeSet set1 = new TreeSet();
set1.add(new Certificate("MCA"));
set1.add(new Certificate("MBA"));
set1.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
TreeSet set2 = new TreeSet();
set2.add(new Certificate("BCA"));
set2.add(new Certificate("BA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
TUTORIALS POINT
Simply Easy Learning
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, SortedSet cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
SortedSet certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
TUTORIALS POINT
Simply Easy Learning
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create MyClass.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your
mapping file, simply set sort="natural" and execute your program and compare the results.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: PMP
Certificate: MCA
TUTORIALS POINT
Simply Easy Learning
Certificate: MBA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: PMP
Certificate: MCA
Certificate: MBA
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from employee;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from certificate;
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
| 1 | MBA | 1 |
| 2 | PMP | 1 |
| 3 | MCA | 1 |
+----+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Hibernate List Mappings
A List is a java collection that stores elements in sequence and allow duplicate elements. The user of this
interface has precise control over where in the list each element is inserted. The user can access elements by
their integer index, and search for elements in the list. More formally, lists typically allow pairs of elements e1 and
e2 such that e1.equals(e2), and they typically allow multiple null elements if they allow null elements at all.
A List is mapped with a <list> element in the mapping table and initialized with java.util.ArrayList.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
TUTORIALS POINT
Simply Easy Learning
Further, assume each employee can have one or more certificate associated with him/her. A List collection
mapping needs an index column in the collection table. The index column defines the position of the element in
the collection. So we will store certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
idx INT default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects.
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in List variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private List certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public List getCertificates() {
return certificates;
TUTORIALS POINT
Simply Easy Learning
}
public void setCertificates( List certificates ) {
this.certificates = certificates;
}
}
We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table.
public class Certificate{
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <list> element will be used to define the rule for List collection used. The index of list is always of type integer
and is mapped using the <list-index> element.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<list name="certificates" cascade="all">
<key column="employee_id"/>
<list-index column="idx"/>
<one-to-many class="Certificate"/>
</list>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
TUTORIALS POINT
Simply Easy Learning
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <list> element is used to set the relationship between Certificate and Employee classes. We used
the cascade attribute in the <list> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the defined Listvariable in the parent class, in our case
it is certificates.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie.
table EMPLOYEE.
 The <list-index> element is used to keep the position of the element and map with the index column in the
collection table. The index of the persistent list starts at zero. You could change this, for example, with <list-
index base="1".../> in your mapping.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement. If we changed this example
to use a many-to-many relationship, we would need an association table to map between the parent and the
child objects.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
TUTORIALS POINT
Simply Easy Learning
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
ArrayList set1 = new ArrayList();
set1.add(new Certificate("MCA"));
set1.add(new Certificate("MBA"));
set1.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
ArrayList set2 = new ArrayList();
set2.add(new Certificate("BCA"));
set2.add(new Certificate("BA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, ArrayList cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
TUTORIALS POINT
Simply Easy Learning
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
List certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
TUTORIALS POINT
Simply Easy Learning
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your
mapping file, simply set sort="natural" and execute your program and compare the results.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MCA
Certificate: MBA
Certificate: PMP
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MCA
Certificate: MBA
Certificate: PMP
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 51 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from CERTIFICATE;
+----+------------------+------+-------------+
| id | certificate_name | idx | employee_id |
+----+------------------+------+-------------+
| 6 | MCA | 0 | 51 |
| 7 | MBA | 1 | 51 |
| 8 | PMP | 2 | 51 |
+----+------------------+------+-------------+
3 rows in set (0.00 sec
mysql>
Alternatively, you could map a Java array instead of a list. A array mapping is virtually identical to the previous
example, except with different element and attribute names (<array> and <array-index>). However, for reasons
explained earlier, Hibernate applications rarely use arrays.
TUTORIALS POINT
Simply Easy Learning
Hibernate Bag Mappings
A Bag is a java collection that stores elements without caring about the sequencing but allow duplicate elements
in the list. A bag is a random grouping of the objects in the list.
A Collection is mapped with a <bag> element in the mapping table and initialized with java.util.ArrayList.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. We will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects.
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in List variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private Collection certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
TUTORIALS POINT
Simply Easy Learning
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Collection getCertificates() {
return certificates;
}
public void setCertificates( Collection certificates ) {
this.certificates = certificates;
}
}
We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table.
public class Certificate{
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <bag> element will be used to define the rule for the Collection used.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
TUTORIALS POINT
Simply Easy Learning
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<bag name="certificates" cascade="all">
<key column="employee_id"/>
<one-to-many class="Certificate"/>
</bag>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying
database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <bag> element is used to set the relationship between Certificate and Employee classes. We used
the cascade attribute in the <bag> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the definedCollection variable in the parent class, in
our case it is certificates.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object
ie. table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement.
TUTORIALS POINT
Simply Easy Learning
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
ArrayList set1 = new ArrayList();
set1.add(new Certificate("MCA"));
set1.add(new Certificate("MBA"));
set1.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
ArrayList set2 = new ArrayList();
set2.add(new Certificate("BCA"));
set2.add(new Certificate("BA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, ArrayList cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
TUTORIALS POINT
Simply Easy Learning
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Collection certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
TUTORIALS POINT
Simply Easy Learning
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your
mapping file, simply set sort="natural" and execute your program and compare the results.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MCA
Certificate: MBA
Certificate: PMP
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MCA
Certificate: MBA
Certificate: PMP
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 53 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from CERTIFICATE;
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
TUTORIALS POINT
Simply Easy Learning
| 11 | MCA | 53 |
| 12 | MBA | 53 |
| 13 | PMP | 53 |
+----+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Hibernate Map Mappings
A Map is a java collection that stores elements in key-value pairs and does not allow duplicate elements in the
list. The Map interface provides three collection views, which allow a map's contents to be viewed as a set of
keys, collection of values, or set of key-value mappings.
A Map is mapped with a <map> element in the mapping table and an unordered map can be initialized with
java.util.HashMap.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. We will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_type VARCHAR(40) default NULL,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects.
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in List variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
TUTORIALS POINT
Simply Easy Learning
private int salary;
private Map certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Map getCertificates() {
return certificates;
}
public void setCertificates( Map certificates ) {
this.certificates = certificates;
}
}
We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table.
public class Certificate{
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getName() {
TUTORIALS POINT
Simply Easy Learning
return name;
}
public void setName( String name ) {
this.name = name;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <map> element will be used to define the rule for the Map used.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<map name="certificates" cascade="all">
<key column="employee_id"/>
<index column="certificate_type" type="string"/>
<one-to-many class="Certificate"/>
</map>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
TUTORIALS POINT
Simply Easy Learning
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <map> element is used to set the relationship between Certificate and Employee classes. We used
the cascade attribute in the <map> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the defined Mapvariable in the parent class, in our case
it is certificates.
 The <index> element is used to represents the key parts of the key/value map pair. The key will be stored in
the column certificate_type using a type of string.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie.
table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save an Employee record alongwith a list of certificates and then we will apply CRUD operations on
that record.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
HashMap set = new HashMap();
set.put("ComputerScience", new Certificate("MCA"));
set.put("BusinessManagement", new Certificate("MBA"));
set.put("ProjectManagement", new Certificate("PMP"));
/* Add employee records in the database */
Integer empID = ME.addEmployee("Manoj", "Kumar", 4000, set);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID, 5000);
/* List down all the employees */
ME.listEmployees();
}
TUTORIALS POINT
Simply Easy Learning
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, HashMap cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Map ec = employee.getCertificates();
System.out.println("Certificate: " +
(((Certificate)ec.get("ComputerScience")).getName()));
System.out.println("Certificate: " +
(((Certificate)ec.get("BusinessManagement")).getName()));
System.out.println("Certificate: " +
(((Certificate)ec.get("ProjectManagement")).getName()));
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
TUTORIALS POINT
Simply Easy Learning
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MCA
Certificate: MBA
Certificate: PMP
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MCA
Certificate: MBA
Certificate: PMP
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
TUTORIALS POINT
Simply Easy Learning
+----+------------+-----------+--------+
| 60 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql>select * from CERTIFICATE;
+----+--------------------+------------------+-------------+
| id | certificate_type | certificate_name | employee_id |
+----+--------------------+------------------+-------------+
| 16 | ProjectManagement | PMP | 60 |
| 17 | BusinessManagement | MBA | 60 |
| 18 | ComputerScience | MCA | 60 |
+----+--------------------+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Hibernate SortedMap Mappings
A SortedMap is a similar java collection as Map that stores elements in key-value pairs and provides a total
ordering on its keys. Duplicate elements are not allowed in the map. The map is ordered according to the natural
ordering of its keys, or by a Comparator typically provided at sorted map creation time.
A SortedMap is mapped with a <map> element in the mapping table and an ordered map can be initialized with
java.util.TreeMap.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. We will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_type VARCHAR(40) default NULL,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects.
TUTORIALS POINT
Simply Easy Learning
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in List variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private SortedMap certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public SortedMap getCertificates() {
return certificates;
}
public void setCertificates( SortedMap certificates ) {
this.certificates = certificates;
}
}
We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table. This class should also implement Comparable interface and
compareTo method which will be used to sort the key elements of the SortedMap in case you set sort="natural" in
your mapping file (see below mapping file).
TUTORIALS POINT
Simply Easy Learning
public class Certificate implements Comparable <String>{
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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 int compareTo(String that){
final int BEFORE = -1;
final int AFTER = 1;
if (that == null) {
return BEFORE;
}
Comparable thisCertificate = this;
Comparable thatCertificate = that;
if(thisCertificate == null) {
return AFTER;
} else if(thatCertificate == null) {
return BEFORE;
} else {
return thisCertificate.compareTo(thatCertificate);
}
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <map> element will be used to define the rule for the Map used.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<map name="certificates" cascade="all" sort="MyClass">
<key column="employee_id"/>
<index column="certificate_type" type="string"/>
TUTORIALS POINT
Simply Easy Learning
<one-to-many class="Certificate"/>
</map>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <map> element is used to set the relationship between Certificate and Employee classes. We used
the cascade attribute in the <map> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the definedSortedMap variable in the parent class, in
our case it is certificates. The sort attribute can be set to natural to have natural sorting or it can be set to a
custom class implementingjava.util.Comparator. We have used a class MyClass which implements
java.util.Comparator to reverse the sorting order implemented in Certificate class.
 The <index> element is used to represents the key parts of the key/value map pair. The key will be stored in
the column certificate_type using a type of string.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie.
table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as
such, the Certificate object must have a Employee parent associated with it. You can use either <one-to-
one>, <many-to-one> or <many-to-many> elements based on your requirement.
If we use sort="natural" setting then we do not need to create a separate class because Certificate class already
has implemented Comparable interface and hibernate will use compareTo() method defined in Certificate class to
compare SortedMap keys. But we are using a custom comparator classMyClass in our mapping file so we would
have to create this class based on our sorting algorithm. Let us do descending sorting of the keys available in the
map.
import java.util.Comparator;
TUTORIALS POINT
Simply Easy Learning
public class MyClass implements Comparator <String>{
public int compare(String o1, String o2) {
final int BEFORE = -1;
final int AFTER = 1;
/* To reverse the sorting order, multiple by -1 */
if (o2 == null) {
return BEFORE * -1;
}
Comparable thisCertificate = o1;
Comparable thatCertificate = o2;
if(thisCertificate == null) {
return AFTER * 1;
} else if(thatCertificate == null) {
return BEFORE * -1;
} else {
return thisCertificate.compareTo(thatCertificate) * -1;
}
}
}
Finally, we will create our application class with the main() method to run the application. We will use this application to save few
Employee's records alongwith their certificates and then we will apply CRUD operations on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
TreeMap set1 = new TreeMap();
set1.put("ComputerScience", new Certificate("MCA"));
set1.put("BusinessManagement", new Certificate("MBA"));
set1.put("ProjectManagement", new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
TreeMap set2 = new TreeMap();
set2.put("ComputerScience", new Certificate("MCA"));
set2.put("BusinessManagement", new Certificate("MBA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
TUTORIALS POINT
Simply Easy Learning
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, TreeMap cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
SortedMap<String, Certificate> map =
employee.getCertificates();
for(Map.Entry<String,Certificate> entry : map.entrySet()){
System.out.print("tCertificate Type: " + entry.getKey());
System.out.println(", Name: " +
(entry.getValue()).getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
TUTORIALS POINT
Simply Easy Learning
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create MyClass.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables. You can see certificates type has been sorted in reverse order. You can try by changing
your mapping file, simply set sort="natural" and execute your program and compare the results.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate Type: ProjectManagement, Name: PMP
Certificate Type: ComputerScience, Name: MCA
Certificate Type: BusinessManagement, Name: MBA
First Name: Dilip Last Name: Kumar Salary: 3000
TUTORIALS POINT
Simply Easy Learning
Certificate Type: ComputerScience, Name: MCA
Certificate Type: BusinessManagement, Name: MBA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate Type: ProjectManagement, Name: PMP
Certificate Type: ComputerScience, Name: MCA
Certificate Type: BusinessManagement, Name: MBA
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 74 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from CERTIFICATE;
+----+--------------------+------------------+-------------+
| id | certificate_type | certificate_name | employee_id |
+----+--------------------+------------------+-------------+
| 52 | BusinessManagement | MBA | 74 |
| 53 | ComputerScience | MCA | 74 |
| 54 | ProjectManagement | PMP | 74 |
+----+--------------------+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Association Mappings
The mapping of associations between entity classes and the relationships between tables is the soul of ORM.
Following are the four ways in which the cardinality of the relationship between the objects can be expressed. An
association mapping can be unidirectional as well as bidirectional.
Mapping type Description
Many-to-One Mapping many-to-one relationship using Hibernate
One-to-One Mapping one-to-one relationship using Hibernate
One-to-Many Mapping one-to-many relationship using Hibernate
Many-to-Many Mapping many-to-many relationship using Hibernate
Hibernate Many-to-One Mappings
A many-to-one association is the most common kind of association where an Object can be associated with
multiple objects. For example a same address object can be associated with multiple employee objects.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
TUTORIALS POINT
Simply Easy Learning
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
address INT NOT NULL,
PRIMARY KEY (id)
);
Further, many employee can have same address, so this association can be presented using many-to-one
association. We will store address related information in a separate table which has following structure:
create table ADDRESS (
id INT NOT NULL auto_increment,
street_name VARCHAR(40) default NULL,
city_name VARCHAR(40) default NULL,
state_name VARCHAR(40) default NULL,
zipcode VARCHAR(10) default NULL,
PRIMARY KEY (id)
);
Create both the RBDMS tables and keep them ready for the next implementation.
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a variable of Address type.
import java.util.*;
public class Employee{
private int id;
private String firstName;
private String lastName;
private int salary;
private Address address;
public Employee() {}
public Employee(String fname, String lname,
int salary, Address address ) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
this.address = address;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
TUTORIALS POINT
Simply Easy Learning
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress( Address address ) {
this.address = address;
}
}
We need to define another POJO class corresponding to ADDRESS table so that address objects can be stored
and retrieved into the ADDRESS table.
import java.util.*;
public class Address{
private int id;
private String street;
private String city;
private String state;
private String zipcode;
public Address() {}
public Address(String street, String city,
String state, String zipcode) {
this.street = street;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet( String street ) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity( String city ) {
this.city = city;
}
public String getState() {
return state;
}
TUTORIALS POINT
Simply Easy Learning
public void setState( String state ) {
this.state = state;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode( String zipcode ) {
this.zipcode = zipcode;
}
}
Define Hibernate Mapping File
Let us develop our mapping files which instructs Hibernate how to map the defined classes to the database
tables. The <many-to-one> element will be used to define the rule to establish a many-to-one relationship
between EMPLOYEE and ADDRESS entities.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
<many-to-one name="address" column="address"
class="Address" not-null="true"/>
</class>
<class name="Address" table="ADDRESS">
<meta attribute="class-description">
This class contains the address detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="street" column="street_name" type="string"/>
<property name="city" column="city_name" type="string"/>
<property name="state" column="state_name" type="string"/>
<property name="zipcode" column="zipcode" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
TUTORIALS POINT
Simply Easy Learning
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying
database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <many-to-one> element is used to set the relationship between EMPLOYEE and ADDRESS entities.
The name attribute is set to the defined variable in the parent class, in our case it isaddress.
The column attribute is used to set the column name in the parent table EMPLOYEE.
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have one address object */
Address address = ME.addAddress("Kondapur","Hyderabad","AP","532");
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address);
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
TUTORIALS POINT
Simply Easy Learning
}
/* Method to add an address record in the database */
public Address addAddress(String street, String city,
String state, String zipcode) {
Session session = factory.openSession();
Transaction tx = null;
Integer addressID = null;
Address address = null;
try{
tx = session.beginTransaction();
address = new Address(street, city, state, zipcode);
addressID = (Integer) session.save(address);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return address;
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Address address){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary, address);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Address add = employee.getAddress();
System.out.println("Address ");
System.out.println("tStreet: " + add.getStreet());
System.out.println("tCity: " + add.getCity());
System.out.println("tState: " + add.getState());
System.out.println("tZipcode: " + add.getZipcode());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
TUTORIALS POINT
Simply Easy Learning
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Address.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
ADDRESS tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
TUTORIALS POINT
Simply Easy Learning
First Name: Manoj Last Name: Kumar Salary: 4000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Manoj Last Name: Kumar Salary: 5000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+---------+
| id | first_name | last_name | salary | address |
+----+------------+-----------+--------+---------+
| 1 | Manoj | Kumar | 5000 | 5 |
+----+------------+-----------+--------+---------+
1 row in set (0.00 sec)
mysql> select * from ADDRESS;
+----+-------------+-----------+------------+---------+
| id | street_name | city_name | state_name | zipcode |
+----+-------------+-----------+------------+---------+
| 1 | Kondapur | Hyderabad | AP | 532 |
+----+-------------+-----------+------------+---------+
1 row in set (0.00 sec)
mysql>
Hibernate One-to-One Mappings
A one-to-one association is similar to many-to-one association with a difference that the column will be set as
unique. For example an address object can be associated with a single employee object.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
TUTORIALS POINT
Simply Easy Learning
address INT NOT NULL,
PRIMARY KEY (id)
);
Further, assuming that an address can be associated a single employee only, so this association can be
presented using one-to-one association. We will store address related information in a separate table which has
following structure:
create table ADDRESS (
id INT NOT NULL auto_increment,
street_name VARCHAR(40) default NULL,
city_name VARCHAR(40) default NULL,
state_name VARCHAR(40) default NULL,
zipcode VARCHAR(10) default NULL,
PRIMARY KEY (id)
);
Create both the RBDMS tables and keep them ready for the next implementation.
Define POJO Classes
Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a variable of Address type.
import java.util.*;
public class Employee{
private int id;
private String firstName;
private String lastName;
private int salary;
private Address address;
public Employee() {}
public Employee(String fname, String lname,
int salary, Address address ) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
this.address = address;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
TUTORIALS POINT
Simply Easy Learning
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress( Address address ) {
this.address = address;
}
}
We need to define another POJO class corresponding to ADDRESS table so that address objects can be stored
and retrieved into the ADDRESS table.
import java.util.*;
public class Address{
private int id;
private String street;
private String city;
private String state;
private String zipcode;
public Address() {}
public Address(String street, String city,
String state, String zipcode) {
this.street = street;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet( String street ) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity( String city ) {
this.city = city;
}
public String getState() {
return state;
}
public void setState( String state ) {
this.state = state;
}
public String getZipcode() {
TUTORIALS POINT
Simply Easy Learning
return zipcode;
}
public void setZipcode( String zipcode ) {
this.zipcode = zipcode;
}
}
Define Hibernate Mapping File
Let us develop our mapping files which instructs Hibernate how to map the defined classes to the database
tables. The <many-to-one> element will be used to define the rule to establish a one-to-one relationship between
EMPLOYEE and ADDRESS entities but column attribute will be set to uniqueconstraint and rest of the mapping
file will remain as it was in case of many-to-one association.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
<many-to-one name="address" column="address" unique="true"
class="Address" not-null="true"/>
</class>
<class name="Address" table="ADDRESS">
<meta attribute="class-description">
This class contains the address detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="street" column="street_name" type="string"/>
<property name="city" column="city_name" type="string"/>
<property name="state" column="state_name" type="string"/>
<property name="zipcode" column="zipcode" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
TUTORIALS POINT
Simply Easy Learning
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <many-to-one> element is used to set the relationship between EMPLOYEE and ADDRESS entities.
The name attribute is set to the defined variable in the parent class, in our case it isaddress.
The column attribute is used to set the column name in the parent table EMPLOYEE which is set
to unique so that only one Employee object can be associated with an address object.
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have one address object */
Address address1 = ME.addAddress("Kondapur","Hyderabad","AP","532");
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address1);
/* Let us have another address object */
Address address2 = ME.addAddress("Saharanpur","Ambehta","UP","111");
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an address record in the database */
public Address addAddress(String street, String city,
String state, String zipcode) {
Session session = factory.openSession();
Transaction tx = null;
TUTORIALS POINT
Simply Easy Learning
Integer addressID = null;
Address address = null;
try{
tx = session.beginTransaction();
address = new Address(street, city, state, zipcode);
addressID = (Integer) session.save(address);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return address;
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Address address){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary, address);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Address add = employee.getAddress();
System.out.println("Address ");
System.out.println("tStreet: " + add.getStreet());
System.out.println("tCity: " + add.getCity());
System.out.println("tState: " + add.getState());
System.out.println("tZipcode: " + add.getZipcode());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
TUTORIALS POINT
Simply Easy Learning
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Address.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
ADDRESS tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Saharanpur
City: Ambehta
State: UP
Zipcode: 111
First Name: Manoj Last Name: Kumar Salary: 5000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Saharanpur
TUTORIALS POINT
Simply Easy Learning
City: Ambehta
State: UP
Zipcode: 111
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+---------+
| id | first_name | last_name | salary | address |
+----+------------+-----------+--------+---------+
| 7 | Manoj | Kumar | 5000 | 5 |
| 8 | Dilip | Kumar | 3000 | 6 |
+----+------------+-----------+--------+---------+
2 rows in set (0.00 sec)
mysql> select * from ADDRESS;
+----+-------------+-----------+------------+---------+
| id | street_name | city_name | state_name | zipcode |
+----+-------------+-----------+------------+---------+
| 5 | Kondapur | Hyderabad | AP | 532 |
| 6 | Saharanpur | Ambehta | UP | 111 |
+----+-------------+-----------+------------+---------+
2 rows in set (0.00 sec)
mysql>
Hibernate One-to-Many Mappings
A One-to-Many mapping can be implemented using a Set java collection that does not contain any duplicate
element. We already have seen how to map Set collection in hibernate, so if you already learned Set mapping
then you are all set to go with one-to-many mapping.
A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set
collection in your class when there is no duplicate element required in the collection.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her. So we will store
certificate related information in a separate table which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
employee_id INT default NULL,
TUTORIALS POINT
Simply Easy Learning
PRIMARY KEY (id)
);
There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects:
Define POJO Classes
Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in Set variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private Set certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Set getCertificates() {
return certificates;
}
public void setCertificates( Set certificates ) {
this.certificates = certificates;
}
}
Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be
stored and retrieved into the CERTIFICATE table. This class should also implement both the equals() and
hashCode() methods so that Java can determine whether any two elements/objects are identical.
TUTORIALS POINT
Simply Easy Learning
public class Certificate {
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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 boolean equals(Object obj) {
if (obj == null) return false;
if (!this.getClass().equals(obj.getClass())) return false;
Certificate obj2 = (Certificate)obj;
if((this.id == obj2.getId()) && (this.name.equals(obj2.getName())))
{
return true;
}
return false;
}
public int hashCode() {
int tmp = 0;
tmp = ( id + name ).hashCode();
return tmp;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<set name="certificates" cascade="all">
<key column="employee_id"/>
<one-to-many class="Certificate"/>
</set>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
TUTORIALS POINT
Simply Easy Learning
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying
database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <set> element sets the relationship between Certificate and Employee classes. We used
the cascade attribute in the <set> element to tell Hibernate to persist the Certificate objects at the same time
as the Employee objects. The name attribute is set to the defined Set variable in the parent class, in our case
it is certificates. For each set variable, we need to define a separate set element in the mapping file.
 The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object
ie. table EMPLOYEE.
 The <one-to-many> element indicates that one Employee object relates to many Certificate objects.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
TUTORIALS POINT
Simply Easy Learning
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
HashSet set1 = new HashSet();
set1.add(new Certificate("MCA"));
set1.add(new Certificate("MBA"));
set1.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1);
/* Another set of certificates for the second employee */
HashSet set2 = new HashSet();
set2.add(new Certificate("BCA"));
set2.add(new Certificate("BA"));
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Set cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
TUTORIALS POINT
Simply Easy Learning
System.out.println(" Salary: " + employee.getSalary());
Set certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
TUTORIALS POINT
Simply Easy Learning
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE and
CERTIFICATE tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MBA
Certificate: PMP
Certificate: MCA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: BCA
Certificate: BA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MBA
Certificate: PMP
Certificate: MCA
If you check your EMPLOYEE and CERTIFICATE tables, they should have following records:
mysql> select * from employee;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from certificate;
+----+------------------+-------------+
| id | certificate_name | employee_id |
+----+------------------+-------------+
| 1 | MBA | 1 |
| 2 | PMP | 1 |
| 3 | MCA | 1 |
+----+------------------+-------------+
3 rows in set (0.00 sec)
mysql>
Hibernate Many-to-Many Mappings
A Many-to-Many mapping can be implemented using a Set java collection that does not contain any duplicate
element. We already have seen how to map Set collection in hibernate, so if you already learned Set mapping
then you are all set to go with many-to-many mapping.
A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set
collection in your class when there is no duplicate element required in the collection.
TUTORIALS POINT
Simply Easy Learning
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Further, assume each employee can have one or more certificate associated with him/her and a similar certificate
can be associated with more than one employee. We will store certificate related information in a separate table
which has following structure:
create table CERTIFICATE (
id INT NOT NULL auto_increment,
certificate_name VARCHAR(30) default NULL,
PRIMARY KEY (id)
);
Now to implement many-to-many relationship between EMPLOYEE and CERTIFICATE objects, we would have
to introduce one more intermediate table having Employee ID and Certificate ID as follows:
create table EMP_CERT (
employee_id INT NOT NULL,
certificate_id INT NOT NULL,
PRIMARY KEY (employee_id,certificate_id)
);
Define POJO Classes
Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table
and having a collection of certificates in Set variable.
import java.util.*;
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
private Set certificates;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
TUTORIALS POINT
Simply Easy Learning
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Set getCertificates() {
return certificates;
}
public void setCertificates( Set certificates ) {
this.certificates = certificates;
}
}
Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and
retrieved into the CERTIFICATE table. This class should also implement both the equals() and hashCode() methods so that
Java can determine whether any two elements/objects are identical.
public class Certificate {
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
this.name = name;
}
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 boolean equals(Object obj) {
if (obj == null) return false;
if (!this.getClass().equals(obj.getClass())) return false;
Certificate obj2 = (Certificate)obj;
if((this.id == obj2.getId()) && (this.name.equals(obj2.getName())))
{
return true;
}
return false;
}
public int hashCode() {
int tmp = 0;
tmp = ( id + name ).hashCode();
return tmp;
}
}
TUTORIALS POINT
Simply Easy Learning
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <set> element will be used to define the rule for many-to-many relationship.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<set name="certificates" cascade="save-update" table="EMP_CERT">
<key column="employee_id"/>
<many-to-many column="certificate_id" class="Certificate"/>
</set>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <set> element sets the relationship between Certificate and Employee classes. We setcascade attribute
to save-update to tell Hibernate to persist the Certificate objects for SAVE i.e. CREATE and UPDATE
TUTORIALS POINT
Simply Easy Learning
operations at the same time as the Employee objects. The name attribute is set to the defined Set variable in
the parent class, in our case it is certificates. For each set variable, we need to define a separate set element
in the mapping file. Here we used nameattribute to set the intermediate table name to EMP_CERT.
 The <key> element is the column in the EMP_CERT table that holds the foreign key to the parent object ie.
table EMPLOYEE and links to the certification_id in the CERTIFICATE table.
 The <many-to-many> element indicates that one Employee object relates to many Certificate objects and
column attributes are used to link intermediate EMP_CERT.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have a set of certificates for the first employee */
HashSet certificates = new HashSet();
certificates.add(new Certificate("MCA"));
certificates.add(new Certificate("MBA"));
certificates.add(new Certificate("PMP"));
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, certificates);
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, certificates);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Set cert){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
TUTORIALS POINT
Simply Easy Learning
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employee.setCertificates(cert);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator1 =
employees.iterator(); iterator1.hasNext();){
Employee employee = (Employee) iterator1.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Set certificates = employee.getCertificates();
for (Iterator iterator2 =
certificates.iterator(); iterator2.hasNext();){
Certificate certName = (Certificate) iterator2.next();
System.out.println("Certificate: " + certName.getName());
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to delete an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
TUTORIALS POINT
Simply Easy Learning
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create Certificate.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE,
EMP_CERT and CERTIFICATE tables.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Certificate: MBA
Certificate: PMP
Certificate: MCA
First Name: Dilip Last Name: Kumar Salary: 3000
Certificate: MBA
Certificate: PMP
Certificate: MCA
First Name: Manoj Last Name: Kumar Salary: 5000
Certificate: MBA
Certificate: PMP
Certificate: MCA
If you check your EMPLOYEE, EMP_CERT and CERTIFICATE tables, they should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 22 | Manoj | Kumar | 5000 |
+----+------------+-----------+--------+
1 row in set (0.00 sec)
TUTORIALS POINT
Simply Easy Learning
mysql> select * from CERTIFICATE;
+----+------------------+
| id | certificate_name |
+----+------------------+
| 4 | MBA |
| 5 | PMP |
| 6 | MCA |
+----+------------------+
3 rows in set (0.00 sec)
mysql> select * from EMP_CERT;
+-------------+----------------+
| employee_id | certificate_id |
+-------------+----------------+
| 22 | 4 |
| 22 | 5 |
| 22 | 6 |
+-------------+----------------+
3 rows in set (0.00 sec)
mysql>
Component Mappings
It is very much possible that an Entity class can have a reference to another class as a member variable. If the
referred class does not have it's own life cycle and completely depends on the life cycle of the owning entity class,
then the referred class hence therefore is called as the Component class.
The mapping of Collection of Components is also possible in a similar way just as the mapping of regular
Collections with minor configuration differences. We will see these two mappings in detail with examples.
Mapping type Description
Component Mappings
Mapping for a class having a reference to another class as a member
variable.
Hibernate Component Mappings
A Component mapping is a mapping for a class having a reference to another class as a member variable. We
have seen such mapping while having two tables and using <set> element in the mapping file. Now we will use
<component> element in the mapping file and a single table would be used to keep the attributes contained inside
the class variable.
Define RDBMS Tables
Consider a situation where we need to store our employee records in EMPLOYEE table which will have following
structure:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
TUTORIALS POINT
Simply Easy Learning
);
Further, assume each employe will have an address, so let us add address specific fields in the same table as
follows:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
street_name VARCHAR(40) default NULL,
city_name VARCHAR(40) default NULL,
state_name VARCHAR(40) default NULL,
zipcode VARCHAR(10) default NULL,
PRIMARY KEY (id)
);
Define POJO Classes
Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE
table.
import java.util.*;
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
private int salary;
private Address address;
public Employee() {}
public Employee(String fname, String lname,
int salary, Address address ) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
this.address = address;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
TUTORIALS POINT
Simply Easy Learning
}
public void setSalary( int salary ) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress( Address address ) {
this.address = address;
}
}
We need to define another POJO class corresponding to ADDRESS entity having address related fields.
import java.util.*;
public class Address{
private int id;
private String street;
private String city;
private String state;
private String zipcode;
public Address() {}
public Address(String street, String city,
String state, String zipcode) {
this.street = street;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getStreet() {
return street;
}
public void setStreet( String street ) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity( String city ) {
this.city = city;
}
public String getState() {
return state;
}
public void setState( String state ) {
this.state = state;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode( String zipcode ) {
TUTORIALS POINT
Simply Easy Learning
this.zipcode = zipcode;
}
}
Define Hibernate Mapping File
Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables.
The <component> element will be used to define the rule for all the fields associated with ADDRESS table.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<component name="address" class="Address">
<property name="street" column="street_name" type="string"/>
<property name="city" column="city_name" type="string"/>
<property name="state" column="state_name" type="string"/>
<property name="zipcode" column="zipcode" type="string"/>
</component>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
<class name="Certificate" table="CERTIFICATE">
<meta attribute="class-description">
This class contains the certificate records.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="certificate_name" type="string"/>
</class>
</hibernate-mapping>
You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping
document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all
the elements of mapping file once again:
 The mapping document is an XML document having <hibernate-mapping> as the root element which
contains two <class> elements corresponding to each class.
 The <class> elements are used to define specific mappings from a Java classes to the database tables. The
Java class name is specified using the name attribute of the class element and the database table name is
specified using the table attribute.
 The <meta> element is optional element and can be used to create the class description.
 The <id> element maps the unique ID attribute in class to the primary key of the database table.
The name attribute of the id element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
TUTORIALS POINT
Simply Easy Learning
 The <generator> element within the id element is used to automatically generate the primary key values. Set
the class attribute of the generator element is set to native to let hibernate pick up either identity,
sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
 The <property> element is used to map a Java class property to a column in the database table.
The name attribute of the element refers to the property in the class and the column attribute refers to the
column in the database table. The type attribute holds the hibernate mapping type, this mapping types will
convert from Java to SQL data type.
 The <component> element sets the existence of different attributes of Address class inside Employee
classes.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records alongwith their certificates and then we will apply CRUD operations
on those records.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Let us have one address object */
Address address1 = ME.addAddress("Kondapur","Hyderabad","AP","532");
/* Add employee records in the database */
Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address1);
/* Let us have another address object */
Address address2 = ME.addAddress("Saharanpur","Ambehta","UP","111");
/* Add another employee record in the database */
Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address2);
/* List down all the employees */
ME.listEmployees();
/* Update employee's salary records */
ME.updateEmployee(empID1, 5000);
/* List down all the employees */
ME.listEmployees();
}
/* Method to add an address record in the database */
public Address addAddress(String street, String city,
String state, String zipcode) {
Session session = factory.openSession();
Transaction tx = null;
Integer addressID = null;
TUTORIALS POINT
Simply Easy Learning
Address address = null;
try{
tx = session.beginTransaction();
address = new Address(street, city, state, zipcode);
addressID = (Integer) session.save(address);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return address;
}
/* Method to add an employee record in the database */
public Integer addEmployee(String fname, String lname,
int salary, Address address){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary, address);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to list all the employees detail */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
Address add = employee.getAddress();
System.out.println("Address ");
System.out.println("tStreet: " + add.getStreet());
System.out.println("tCity: " + add.getCity());
System.out.println("tState: " + add.getState());
System.out.println("tZipcode: " + add.getZipcode());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to update salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
TUTORIALS POINT
Simply Easy Learning
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result on the screen, and same time records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Manoj Last Name: Kumar Salary: 4000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Saharanpur
City: Ambehta
State: UP
Zipcode: 111
First Name: Manoj Last Name: Kumar Salary: 5000
Address
Street: Kondapur
City: Hyderabad
State: AP
Zipcode: 532
First Name: Dilip Last Name: Kumar Salary: 3000
Address
Street: Saharanpur
City: Ambehta
State: UP
TUTORIALS POINT
Simply Easy Learning
Zipcode: 111
If you check your EMPLOYEE table, it should have following records:
mysql> select id, first_name,salary, street_name, state_name from EMPLOYEE;
+----+------------+--------+-------------+------------+
| id | first_name | salary | street_name | state_name |
+----+------------+--------+-------------+------------+
| 1 | Manoj | 5000 | Kondapur | AP |
| 2 | Dilip | 3000 | Saharanpur | UP |
+----+------------+--------+-------------+------------+
2 rows in set (0.00 sec)
mysql>
TUTORIALS POINT
Simply Easy Learning
Hibernate Annotations
So far you have seen how Hibernate uses XML mapping file for the transformation of data from POJO to
database tables and vice versa. Hibernate annotations is the newest way to define mappings without a use of
XML file. You can use annotations in addition to or as a replacement of XML mapping metadata.
Hibernate Annotations is the powerful way to provide the metadata for the Object and Relational Table mapping.
All the metadata is clubbed into the POJO java file along with the code this helps the user to understand the table
structure and POJO simultaneously during the development.
If you going to make your application portable to other EJB 3 compliant ORM applications, you must use
annotations to represent the mapping information but still if you want greater flexibility then you should go with
XML-based mappings.
Environment Setup for Hibernate Annotation
First of all you would have to make sure that you are using JDK 5.0 otherwise you need to upgrade your JDK to
JDK 5.0 to take advantage of the native support for annotations.
Second, you will need to install the Hibernate 3.x annotations distribution package, available from the
sourceforge: (Download Hibernate Annotation) and copy hibernate-annotations.jar, lib/hibernate-comons-
annotations.jar and lib/ejb3-persistence.jar from the Hibernate Annotations distribution to your CLASSPATH
Annotated Class Example
As I mentioned above while working with Hibernate Annotation all the metadata is clubbed into the POJO java file
along with the code this helps the user to understand the table structure and POJO simultaneously during the
development.
Consider we are going to use following EMPLOYEE table to store our objects:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
CHAPTER
12
TUTORIALS POINT
Simply Easy Learning
Following is the mapping of Employee class with annotations to map objects with the defined EMPLOYEE table:
import javax.persistence.*;
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "salary")
private int salary;
public Employee() {}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Hibernate detects that the @Id annotation is on a field and assumes that it should access properties on an object
directly through fields at runtime. If you placed the @Id annotation on the getId() method, you would enable
access to properties through getter and setter methods by default. Hence, all other annotations are also placed
on either fields or getter methods, following the selected strategy. Following section will explain the annotations
used in the above class.
@Entity Annotation
The EJB 3 standard annotations are contained in the javax.persistence package, so we import this package as
the first step. Second we used the @Entity annotation to the Employee class which marks this class as an entity
bean, so it must have a no-argument constructor that is visible with at least protected scope.
TUTORIALS POINT
Simply Easy Learning
@Table Annotation
The @Table annotation allows you to specify the details of the table that will be used to persist the entity in the
database.
The @Table annotation provides four attributes, allowing you to override the name of the table, its catalogue, and
its schema, and enforce unique constraints on columns in the table. For now we are using just table name which
is EMPLOYEE.
@Id and @GeneratedValue Annotations
Each entity bean will have a primary key, which you annotate on the class with the @Id annotation. The primary
key can be a single field or a combination of multiple fields depending on your table structure.
By default, the @Id annotation will automatically determine the most appropriate primary key generation strategy
to be used but you can override this by applying the @GeneratedValue annotation which takes two
parameters strategy and generator which I'm not going to discuss here, so let us use only default the default key
generation strategy. Letting Hibernate determine which generator type to use makes your code portable between
different databases.
@Column Annotation
The @Column annotation is used to specify the details of the column to which a field or property will be mapped.
You can use column annotation with the following most commonly used attributes:
 name attribute permits the name of the column to be explicitly specified.
 length attribute permits the size of the column used to map a value particularly for a String value.
 nullable attribute permits the column to be marked NOT NULL when the schema is generated.
 unique attribute permits the column to be marked as containing only unique values.
Create Application Class
Finally, we will create our application class with the main() method to run the application. We will use this
application to save few Employee's records and then we will apply CRUD operations on those records.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new AnnotationConfiguration().
configure().
//addPackage("com.xyz") //add package if used.
addAnnotatedClass(Employee.class).
buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
TUTORIALS POINT
Simply Easy Learning
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee();
employee.setFirstName(fname);
employee.setLastName(lname);
employee.setSalary(salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
TUTORIALS POINT
Simply Easy Learning
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Database Configuration
Now let us create hibernate.cfg.xml configuration file to define database related parameters. This time we are
not going
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
cohondob
</property>
</session-factory>
TUTORIALS POINT
Simply Easy Learning
</hibernate-configuration>
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Delete Employee.hbm.xml mapping file from the path.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result, and records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 10000
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
If you check your EMPLOYEE table, it should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>
TUTORIALS POINT
Simply Easy Learning
Hibernate Query Language
Hibernate Query Language (HQL) is an object-oriented query language, similar to SQL, but instead of
operating on tables and columns, HQL works with persistent objects and their properties. HQL queries are
translated by Hibernate into conventional SQL queries which in turns perform action on database.
Although you can use SQL statements directly with Hibernate using Native SQL but I would recommend to use
HQL whenever possible to avoid database portability hassles, and to take advantage of Hibernate's SQL
generation and caching strategies.
Keywords like SELECT , FROM and WHERE etc. are not case sensitive but properties like table and column
names are case sensitive in HQL.
FROM Clause
You will use FROM clause if you want to load a complete persistent objects into memory. Following is the simple
syntax of using FROM clause:
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
If you need to fully qualify a class name in HQL, just specify the package and class name as follows:
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
AS Clause
The AS clause can be used to assign aliases to the classes in your HQL queries, specially when you have long
queries. For instance, our previous simple example would be the following:
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
The AS keyword is optional and you can also specify the alias directly after the class name, as follows:
CHAPTER
13
TUTORIALS POINT
Simply Easy Learning
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
SELECT Clause
The SELECT clause provides more control over the result set than the from clause. If you want to obtain few
properties of objects instead of the complete object, use the SELECT clause. Following is the simple syntax of
using SELECT clause to get just first_name field of the Employee object:
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
It is notable here that Employee.firstName is a property of Employee object rather than a field of the
EMPLOYEE table.
WHERE Clause
If you want to narrow the specific objects that are returned from storage, you use the WHERE clause. Following is
the simple syntax of using WHERE clause:
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
ORDER BY Clause
To sort your HQL query's results, you will need to use the ORDER BY clause. You can order the results by any
property on the objects in the result set either ascending (ASC) or descending (DESC). Following is the simple
syntax of using ORDER BY clause:
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
If you wanted to sort by more than one property, you would just add the additional properties to the end of the
order by clause, separated by commas as follows:
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
GROUP BY Clause
This clause lets Hibernate pull information from the database and group it based on a value of an attribute and,
typically, use the result to include an aggregate value. Following is the simple syntax of using GROUP BY clause:
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
TUTORIALS POINT
Simply Easy Learning
Using Named Paramters
Hibernate supports named parameters in its HQL queries. This makes writing HQL queries that accept input from
the user easy and you do not have to defend against SQL injection attacks. Following is the simple syntax of
using named parameters:
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
UPDATE Clause
Bulk updates are new to HQL with Hibernate 3, and deletes work differently in Hibernate 3 than they did in
Hibernate 2. The Query interface now contains a method called executeUpdate() for executing HQL UPDATE or
DELETE statements.
The UPDATE clause can be used to update one or more properties of an one or more objects. Following is the
simple syntax of using UPDATE clause:
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
DELETE Clause
The DELETE clause can be used to delete one or more objects. Following is the simple syntax of using DELETE
clause:
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
INSERT Clause
HQL supports INSERT INTO clause only where records can be inserted from one object to another object.
Following is the simple syntax of using INSERT INTO clause:
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
Aggregate Methods
HQL supports a range of aggregate methods, similar to SQL. They work the same way in HQL as in SQL and
following is the list of the available functions:
TUTORIALS POINT
Simply Easy Learning
S.N. Functions Description
1 avg(property name) The average of a property's value
2 count(property name or *) The number of times a property occurs in the results
3 max(property name) The maximum value of the property values
4 min(property name) The minimum value of the property values
5 sum(property name) The sum total of the property values
The distinct keyword only counts the unique values in the row set. The following query will return only unique
count:
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
Pagination using Query
There are two methods of the Query interface for pagination.
S.N. Method & Description
1
Query setFirstResult(int startPosition)
This method takes an integer that represents the first row in your result set, starting with row 0.
2
Query setMaxResults(int maxResult)
This method tells Hibernate to retrieve a fixed number maxResults of objects.
Using above two methods together, we can construct a paging component in our web or Swing application.
Following is the example which you can extend to fetch 10 rows at a time:
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();
TUTORIALS POINT
Simply Easy Learning
Hibernate Criteria Queries
Hibernate provides alternate ways of manipulating objects and in turn data available in RDBMS tables.
One of the methods is Criteria API which allows you to build up a criteria query object programmatically where
you can apply filtration rules and logical conditions.
The Hibernate Session interface provides createCriteria() method which can be used to create aCriteria object
that returns instances of the persistence object's class when your application executes a criteria query.
Following is the simplest example of a criteria query is one which will simply return every object that corresponds
to the Employee class.
Criteria cr = session.createCriteria(Employee.class);
List results = cr.list();
Restrictions with Criteria
You can use add() method available for Criteria object to add restriction for a criteria query. Following is the
example to add a restriction to return the records with salary is equal to 2000:
Criteria cr = session.createCriteria(Employee.class);
cr.add(Restrictions.eq("salary", 2000));
List results = cr.list();
Following are the few more examples covering different scenarios and can be used as per requirement:
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
// Case sensitive form of the above restriction.
CHAPTER
14
TUTORIALS POINT
Simply Easy Learning
cr.add(Restrictions.ilike("firstName", "zara%"));
// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));
// To check if the given property is null
cr.add(Restrictions.isNull("salary"));
// To check if the given property is not null
cr.add(Restrictions.isNotNull("salary"));
// To check if the given property is empty
cr.add(Restrictions.isEmpty("salary"));
// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));
You can create AND or OR conditions using LogicalExpression restrictions as follows:
Criteria cr = session.createCriteria(Employee.class);
Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");
// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );
// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );
List results = cr.list();
Though all the above conditions can be used directly with HQL as explained in previous tutorial.
Pagination using Criteria
There are two methods of the Criteria interface for pagination.
S.N. Method & Description
1
public Criteria setFirstResult(int firstResult)
This method takes an integer that represents the first row in your result set, starting with row 0.
2
public Criteria setMaxResults(int maxResults)
This method tells Hibernate to retrieve a fixed number maxResults of objects.
Using above two methods together, we can construct a paging component in our web or Swing application.
Following is the example which you can extend to fetch 10 rows at a time:
Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();
TUTORIALS POINT
Simply Easy Learning
Sorting the Results
The Criteria API provides the org.hibernate.criterion.Order class to sort your result set in either ascending or
descending order, according to one of your object's properties. This example demonstrates how you would use
the Order class to sort the result set:
Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));
// To sort records in descening order
crit.addOrder(Order.desc("salary"));
// To sort records in ascending order
crit.addOrder(Order.asc("salary"));
List results = cr.list();
Projections & Aggregations
The Criteria API provides the org.hibernate.criterion.Projections class which can be used to get average,
maximum or minimum of the property values. The Projections class is similar to the Restrictions class in that it
provides several static factory methods for obtaining Projection instances.
Following are the few examples covering different scenarios and can be used as per requirement:
Criteria cr = session.createCriteria(Employee.class);
// To get total row count.
cr.setProjection(Projections.rowCount());
// To get average of a property.
cr.setProjection(Projections.avg("salary"));
// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));
// To get maximum of a property.
cr.setProjection(Projections.max("salary"));
// To get minimum of a property.
cr.setProjection(Projections.min("salary"));
// To get sum of a property.
cr.setProjection(Projections.sum("salary"));
Criteria Queries Example
Consider the following POJO class:
public class Employee {
private int id;
private String firstName;
TUTORIALS POINT
Simply Easy Learning
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Let us create the following EMPLOYEE table to store Employee objects:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Following will be mapping file.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
TUTORIALS POINT
Simply Easy Learning
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Finally, we will create our application class with the main() method to run the application where we will
use Criteria queries:
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 5000);
Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);
/* List down all the employees */
ME.listEmployees();
/* Print Total employee's count */
ME.countEmployee();
/* Print Toatl salary */
ME.totalSalary();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
TUTORIALS POINT
Simply Easy Learning
/* Method to READ all the employees having salary more than 2000 */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// Add restriction.
cr.add(Restrictions.gt("salary", 2000));
List employees = cr.list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to print total number of records */
public void countEmployee(){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// To get total row count.
cr.setProjection(Projections.rowCount());
List rowCount = cr.list();
System.out.println("Total Coint: " + rowCount.get(0) );
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to print sum of salaries */
public void totalSalary(){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Criteria cr = session.createCriteria(Employee.class);
// To get total salary.
cr.setProjection(Projections.sum("salary"));
List totalSalary = cr.list();
System.out.println("Total Salary: " + totalSalary.get(0) );
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
TUTORIALS POINT
Simply Easy Learning
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result, and records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
Total Coint: 4
Total Salary: 15000
If you check your EMPLOYEE table, it should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 14 | Zara | Ali | 2000 |
| 15 | Daisy | Das | 5000 |
| 16 | John | Paul | 5000 |
| 17 | Mohd | Yasee | 3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
mysql>
TUTORIALS POINT
Simply Easy Learning
Hibernate Native SQL
You can use native SQL to express database queries if you want to utilize database-specific features
such as query hints or the CONNECT keyword in Oracle. Hibernate 3.x allows you to specify handwritten SQL,
including stored procedures, for all create, update, delete, and load operations.
Your application will create a native SQL query from the session with the createSQLQuery() method on the
Session interface:
public SQLQuery createSQLQuery(String sqlString) throws HibernateException
After you pass a string containing the SQL query to the createSQLQuery() method, you can associate the SQL
result with either an existing Hibernate entity, a join, or a scalar result using addEntity(), addJoin(), and
addScalar() methods respectively.
Scalar queries
The most basic SQL query is to get a list of scalars (values) from one or more tables. Following is the syntax for
using native SQL for scalar values:
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
Entity queries
The above queries were all about returning scalar values, basically returning the "raw" values from the resultset.
The following is the syntax to get entity objects as a whole from a native sql query via addEntity().
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List results = query.list();
CHAPTER
15
TUTORIALS POINT
Simply Easy Learning
Named SQL queries
The following is the syntax to get entity objects from a native sql query via addEntity() and using named SQL
query.
String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
query.setParameter("employee_id", 10);
List results = query.list();
Native SQL Example
Consider the following POJO class:
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Let us create the following EMPLOYEE table to store Employee objects:
TUTORIALS POINT
Simply Easy Learning
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Following will be mapping file.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Finally, we will create our application class with the main() method to run the application where we will use Native
SQL queries:
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.SQLQuery;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 5000);
Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);
/* List down employees and their salary using Scalar Query */
ME.listEmployeesScalar();
/* List down complete employees information using Entity Query */
TUTORIALS POINT
Simply Easy Learning
ME.listEmployeesEntity();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees using Scalar Query */
public void listEmployeesScalar( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List data = query.list();
for(Object object : data)
{
Map row = (Map)object;
System.out.print("First Name: " + row.get("first_name"));
System.out.println(", Salary: " + row.get("salary"));
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to READ all the employees using Entity Query */
public void listEmployeesEntity( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
String sql = "SELECT * FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List employees = query.list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
TUTORIALS POINT
Simply Easy Learning
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result, and records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
First Name: Zara, Salary: 2000
First Name: Daisy, Salary: 5000
First Name: John, Salary: 5000
First Name: Mohd, Salary: 3000
First Name: Zara Last Name: Ali Salary: 2000
First Name: Daisy Last Name: Das Salary: 5000
First Name: John Last Name: Paul Salary: 5000
First Name: Mohd Last Name: Yasee Salary: 3000
If you check your EMPLOYEE table, it should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 26 | Zara | Ali | 2000 |
| 27 | Daisy | Das | 5000 |
| 28 | John | Paul | 5000 |
| 29 | Mohd | Yasee | 3000 |
+----+------------+-----------+--------+
4 rows in set (0.00 sec)
mysql>
TUTORIALS POINT
Simply Easy Learning
Hibernate Caching
Caching is all about application performance optimization and it sits between your application and the
database to avoid the number of database hits as many as possible to give a better performance for performance
critical applications.
Caching is important to Hibernate as well which utilizes a multilevel caching schemes as explained below:
First-level cache
The first-level cache is the Session cache and is a mandatory cache through which all requests must pass. The
Session object keeps an object under its own power before committing it to the database.
CHAPTER
16
TUTORIALS POINT
Simply Easy Learning
If you issue multiple updates to an object, Hibernate tries to delay doing the update as long as possible to reduce
the number of update SQL statements issued. If you close the session, all the objects being cached are lost and
either persisted or updated in the database.
Second-level cache
Second level cache is an optional cache and first-level cache will always be consulted before any attempt is made
to locate an object in the second-level cache. The second-level cache can be configured on a per-class and per-
collection basis and mainly responsible for caching objects across sessions.
Any third-party cache can be used with Hibernate. An org.hibernate.cache.CacheProvider interface is provided,
which must be implemented to provide Hibernate with a handle to the cache implementation.
Query-level cache
Hibernate also implements a cache for query resultsets that integrates closely with the second-level cache.
This is an optional feature and requires two additional physical cache regions that hold the cached query results
and the timestamps when a table was last updated. This is only useful for queries that are run frequently with the
same parameters.
The Second Level Cache
Hibernate uses first-level cache by default and you have nothing to do to use first-level cache. Let's go straight to
the optional second-level cache. Not all classes benefit from caching, so it's important to be able to disable the
second-level cache
The Hibernate second-level cache is set up in two steps. First, you have to decide which concurrency strategy to
use. After that, you configure cache expiration and physical cache attributes using the cache provider.
Concurrency strategies
A concurrency strategy is a mediator which responsible for storing items of data in the cache and retrieving them
from the cache. If you are going to enable a second-level cache, you will have to decide, for each persistent class
and collection, which cache concurrency strategy to use.
 Transactional: Use this strategy for read-mostly data where it is critical to prevent stale data in concurrent
transactions,in the rare case of an update.
 Read-write: Again use this strategy for read-mostly data where it is critical to prevent stale data in concurrent
transactions,in the rare case of an update.
 Nonstrict-read-write: This strategy makes no guarantee of consistency between the cache and the database.
Use this strategy if data hardly ever changes and a small likelihood of stale data is not of critical concern.
 Read-only: A concurrency strategy suitable for data which never changes. Use it for reference data only.
If we are going to use second-level caching for our Employee class, let us add the mapping element required to
tell Hibernate to cache Employee instances using read-write strategy.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
TUTORIALS POINT
Simply Easy Learning
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<cache usage="read-write"/>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
The usage="read-write" attribute tells Hibernate to use a read-write concurrency strategy for the defined cache.
Cache provider
Your next step after considering the concurrency strategies you will use for your cache candidate classes is to
pick a cache provider. Hibernate forces you to choose a single cache provider for the whole application.
S.N. Cache Name Description
1 EHCache
It can cache in memory or on disk and clustered caching and it
supports the optional Hibernate query result cache.
2 OSCache
Supports caching to memory and disk in a single JVM, with a rich set
of expiration policies and query cache support.
3 warmCache
A cluster cache based on JGroups. It uses clustered invalidation but
doesn't support the Hibernate query cache
4 JBoss Cache
A fully transactional replicated clustered cache also based on the
JGroups multicast library. It supports replication or invalidation,
synchronous or asynchronous communication, and optimistic and
pessimistic locking. The Hibernate query cache is supported
Every cache provider is not compatible with every concurrency strategy. The following compatibility matrix will
help you choose an appropriate combination.
Strategy/Provider Read-only Nonstrictread-write Read-write
Transaction
al
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X
You will specify a cache provider in hibernate.cfg.xml configuration file. We choose EHCache as our second-level
cache provider:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
TUTORIALS POINT
Simply Easy Learning
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root123
</property>
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- List of XML mapping files -->
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Now, you need to specify the properties of the cache regions. EHCache has its own configuration
file,ehcache.xml, which should be in the CLASSPATH of the application. A cache configuration in ehcache.xml
for the Employee class may look like this:
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="Employee"
maxElementsInMemory="500"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
That's it, now we have second-level caching enabled for the Employee class and Hibernate now hits the second-
level cache whenever you navigate to a Employee or when you load a Employee by identifier.
You should analyze your all the classes and choose appropriate caching strategy for each of the classes.
Sometime, second-level caching may downgrade the performance of the application. So it is recommended to
benchmark your application first without enabling caching and later on enable your well suited caching and check
the performance. If caching is not improving system performance then there is no point in enabling any type of
caching.
TUTORIALS POINT
Simply Easy Learning
The Query-level Cache
To use the query cache, you must first activate it using the hibernate.cache.use_query_cache="true"property
in the configuration file. By setting this property to true, you make Hibernate create the necessary caches in
memory to hold the query and identifier sets.
Next, to use the query cache, you use the setCacheable(Boolean) method of the Query class. For example:
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();
Hibernate also supports very fine-grained cache support through the concept of a cache region. A cache region is
part of the cache that's given a name.
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();
This code uses the method to tell Hibernate to store and look for the query in the employee area of the cache.
TUTORIALS POINT
Simply Easy Learning
Hibernate Batch Processing
Consider a situation when you need to upload a large number of records into your database using
Hibernate. Following is the code snippet to achieve this using Hibernate:
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
}
tx.commit();
session.close();
Because by default, Hibernate will cache all the persisted objects in the session-level cache and ultimately your
application would fall over with an OutOfMemoryException somewhere around the 50,000th row. You can
resolve this problem if you are using batch processing with Hibernate.
To use the batch processing feature, first set hibernate.jdbc.batch_size as batch size to a number either at 20
or 50 depending on object size. This will tell the hibernate container that every X rows to be inserted as batch. To
implement this in your code we would need to do little modification as follows:
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
if( i % 50 == 0 ) { // Same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Above code will work fine for the INSERT operation, but if you are willing to make UPDATE operation then you
can achieve using the following code:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
CHAPTER
17
TUTORIALS POINT
Simply Easy Learning
ScrollableResults employeeCursor = session.createQuery("FROM EMPLOYEE")
.scroll();
int count = 0;
while ( employeeCursor.next() ) {
Employee employee = (Employee) employeeCursor.get(0);
employee.updateEmployee();
seession.update(employee);
if ( ++count % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Batch Processing Example
Let us modify configuration file as to add hibernate.jdbc.batch_size property:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name="hibernate.connection.username">
root
</property>
<property name="hibernate.connection.password">
root123
</property>
<property name="hibernate.jdbc.batch_size">
50
</property>
<!-- List of XML mapping files -->
<mapping resource="Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Consider the following POJO Employee class:
TUTORIALS POINT
Simply Easy Learning
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Let us create the following EMPLOYEE table to store Employee objects:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Following will be mapping file to map Employee objects with EMPLOYEE table.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
TUTORIALS POINT
Simply Easy Learning
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Finally, we will create our application class with the main() method to run the application where we will
use flush() and clear() methods available with Session object so that Hibernate keep writing these records into
the database instead of caching them in the memory.
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* Add employee records in batches */
ME.addEmployees( );
}
/* Method to create employee records in batches */
public void addEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
String fname = "First Name " + i;
String lname = "Last Name " + i;
Integer salary = i;
Employee employee = new Employee(fname, lname, salary);
session.save(employee);
if( i % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return ;
}
}
TUTORIALS POINT
Simply Easy Learning
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained above.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program which will create 100000 records in EMPLOYEE table.
TUTORIALS POINT
Simply Easy Learning
Hibernate Interceptors
As you have learnt that in Hibernate, an object will be created and persisted. Once the object has been
changed, it must be saved back to the database. This process continues until the next time the object is needed,
and it will be loaded from the persistent store.
Thus an object passes through different stages in its life cycle and Interceptor Interface provides methods which
can be called at different stages to perform some required tasks. These methods are callbacks from the session
to the application, allowing the application to inspect and/or manipulate properties of a persistent object before it
is saved, updated, deleted or loaded. Following is the list of all the methods available within the Interceptor
interface:
S.N. Method and Description
1
findDirty()
This method is be called when the flush() method is called on a Session object.
2
instantiate()
This method is called when a persisted class is instantiated.
3
isUnsaved()
This method is called when an object is passed to the saveOrUpdate() method/
4
onDelete()
This method is called before an object is deleted.
5
onFlushDirty()
This method is called when Hibernate detects that an object is dirty (ie. have been
changed) during a flush i.e. update operation.
6
onLoad()
This method is called before an object is initialized.
7
onSave()
This method is called before an object is saved.
8
postFlush()
This method is called after a flush has occurred and an object has been updated in
memory.
9
preFlush()
This method is called before a flush.
Hibernate Interceptor gives us total control over how an object will look to both the application and the database.
CHAPTER
18
TUTORIALS POINT
Simply Easy Learning
How to use Interceptors?
To build an interceptor you can either implement Interceptor class directly or extend EmptyInterceptorclass.
Following will be the simple steps to use Hibernate Interceptor functionality.
Create Interceptors
We will extend EmptyInterceptor in our example where Interceptor's method will be called automatically
when Employee object is created and updated. You can implement more methods as per your requirements.
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
public class MyInterceptor extends EmptyInterceptor {
private int updates;
private int creates;
private int loads;
public void onDelete(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
// do nothing
}
// This method is called when Employee object gets updated.
public boolean onFlushDirty(Object entity,
Serializable id,
Object[] currentState,
Object[] previousState,
String[] propertyNames,
Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Update Operation");
return true;
}
return false;
}
public boolean onLoad(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
// do nothing
return true;
}
// This method is called when Employee object gets created.
public boolean onSave(Object entity,
Serializable id,
Object[] state,
String[] propertyNames,
Type[] types) {
if ( entity instanceof Employee ) {
System.out.println("Create Operation");
return true;
}
return false;
}
//called before commit into database
public void preFlush(Iterator iterator) {
System.out.println("preFlush");
TUTORIALS POINT
Simply Easy Learning
}
//called after committed into database
public void postFlush(Iterator iterator) {
System.out.println("postFlush");
}
}
Create POJO Classes
Now let us modify a little bit our first example where we used EMPLOYEE table and Employee class to play with:
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
Create Database Tables
Second step would be creating tables in your database. There would be one table corresponding to each object
you are willing to provide persistence. Consider above objects need to be stored and retrieved into the following
RDBMS table:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
TUTORIALS POINT
Simply Easy Learning
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
Create Mapping Configuration File
This step is to create a mapping file that instructs Hibernate how to map the defined class or classes to the
database tables.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Employee" table="EMPLOYEE">
<meta attribute="class-description">
This class contains the employee detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
Create Application Class
Finally, we will create our application class with the main() method to run the application. Here it should be noted
that while creating session object we used our Interceptor class as an argument.
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
TUTORIALS POINT
Simply Easy Learning
ManageEmployee ME = new ManageEmployee();
/* Add few employee records in database */
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* List down all the employees */
ME.listEmployees();
/* Update employee's records */
ME.updateEmployee(empID1, 5000);
/* Delete an employee from the database */
ME.deleteEmployee(empID2);
/* List down new list of the employees */
ME.listEmployees();
}
/* Method to CREATE an employee in the database */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* Method to READ all the employees */
public void listEmployees( ){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to UPDATE salary for an employee */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
TUTORIALS POINT
Simply Easy Learning
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* Method to DELETE an employee from the records */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession( new MyInterceptor() );
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}
Compilation and Execution
Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and
CLASSPATH appropriately before proceeding for the compilation and execution.
 Create hibernate.cfg.xml configuration file as explained in configuration chapter.
 Create Employee.hbm.xml mapping file as shown above.
 Create Employee.java source file as shown above and compile it.
 Create MyInterceptor.java source file as shown above and compile it.
 Create ManageEmployee.java source file as shown above and compile it.
 Execute ManageEmployee binary to run the program.
You would get following result, and records would be created in EMPLOYEE table.
$java ManageEmployee
.......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
Create Operation
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 1000
First Name: Daisy Last Name: Das Salary: 5000
TUTORIALS POINT
Simply Easy Learning
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush
preFlush
Update Operation
postFlush
preFlush
postFlush
First Name: Zara Last Name: Ali Salary: 5000
First Name: John Last Name: Paul Salary: 10000
preFlush
postFlush
If you check your EMPLOYEE table, it should have following records:
mysql> select * from EMPLOYEE;
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+
2 rows in set (0.00 sec
mysql>

More Related Content

PDF
Hibernate tutorial
PDF
Java tutorial
PDF
Jdbc tutorial
PDF
Jsp tutorial (1)
PDF
Java tutorial
PDF
Sql tutorial
PDF
Java tutorial
PDF
Intellij idea tutorial
Hibernate tutorial
Java tutorial
Jdbc tutorial
Jsp tutorial (1)
Java tutorial
Sql tutorial
Java tutorial
Intellij idea tutorial

What's hot (13)

DOCX
Java completed assignment
PDF
Java interview questions
DOCX
Php5
PDF
The java interview questions ebook - confused coders
PDF
Mybatis tutorial
PDF
Spring tutorial
PDF
Java ibatis tutorial
PDF
Kotlin tutorial
PDF
Design pattern tutorial
PDF
PDF
Jsf tutorial
PDF
Sql tutorial-Structured query language
PDF
SQL tutorial...
Java completed assignment
Java interview questions
Php5
The java interview questions ebook - confused coders
Mybatis tutorial
Spring tutorial
Java ibatis tutorial
Kotlin tutorial
Design pattern tutorial
Jsf tutorial
Sql tutorial-Structured query language
SQL tutorial...
Ad

Similar to Hibernate tutorial (20)

PDF
hibernate_tutorial.pdf
PPTX
Module-3 for career and JFSD ppt for study.pptx
PPTX
Hibernate ppt
PPT
Basic Hibernate Final
DOC
Hibernate tutorial for beginners
PDF
Free Hibernate Tutorial | VirtualNuggets
PPS
Java Hibernate Programming with Architecture Diagram and Example
PPT
Hibernate introduction
PPTX
Hibernate tutorial
PDF
Hibernate 3
PPT
Hibernate
ODP
Hibernate 18052012
PDF
Hibernate Tutorial
PPT
Hibernate Tutorial
PPT
Hibernate java and_oracle
PPT
Hibernate presentation
PPT
Hibernate presentation
PPTX
Hibernate in Action
PDF
Hibernate presentation
PPT
Hibernate jj
hibernate_tutorial.pdf
Module-3 for career and JFSD ppt for study.pptx
Hibernate ppt
Basic Hibernate Final
Hibernate tutorial for beginners
Free Hibernate Tutorial | VirtualNuggets
Java Hibernate Programming with Architecture Diagram and Example
Hibernate introduction
Hibernate tutorial
Hibernate 3
Hibernate
Hibernate 18052012
Hibernate Tutorial
Hibernate Tutorial
Hibernate java and_oracle
Hibernate presentation
Hibernate presentation
Hibernate in Action
Hibernate presentation
Hibernate jj
Ad

More from Vinay H G (12)

PPTX
Continuous integration using jenkins
PDF
Developers best practices_tutorial
PDF
Javamagazine20140304 dl
PDF
Java 8 selected updates
PDF
Why should i switch to Java SE 7
PDF
Lambda Expressions
PDF
Javase7 1641812
PDF
Tutorial storybook
PDF
Virtual dev-day-java7-keynote-1641807
PDF
Agile practice-2012
PDF
OAuth with Restful Web Services
PDF
Java Garbage Collection
Continuous integration using jenkins
Developers best practices_tutorial
Javamagazine20140304 dl
Java 8 selected updates
Why should i switch to Java SE 7
Lambda Expressions
Javase7 1641812
Tutorial storybook
Virtual dev-day-java7-keynote-1641807
Agile practice-2012
OAuth with Restful Web Services
Java Garbage Collection

Recently uploaded (20)

PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Spectroscopy.pptx food analysis technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
cuic standard and advanced reporting.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Encapsulation theory and applications.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
KodekX | Application Modernization Development
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Machine learning based COVID-19 study performance prediction
PDF
Approach and Philosophy of On baking technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Spectroscopy.pptx food analysis technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
MYSQL Presentation for SQL database connectivity
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
sap open course for s4hana steps from ECC to s4
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
cuic standard and advanced reporting.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Encapsulation theory and applications.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Building Integrated photovoltaic BIPV_UPV.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf
The AUB Centre for AI in Media Proposal.docx
Chapter 3 Spatial Domain Image Processing.pdf
KodekX | Application Modernization Development
Network Security Unit 5.pdf for BCA BBA.
Machine learning based COVID-19 study performance prediction
Approach and Philosophy of On baking technology

Hibernate tutorial

  • 2. HIBERNATE TUTORIAL Simply Easy Learning by tutorialspoint.com tutorialspoint.com
  • 3. TUTORIALS POINT Simply Easy Learning ABOUT THE TUTORIAL Hibernate Tutorial Hibernate is a high-performance Object/Relational persistence and query service which is licensed under the open source GNU Lesser General Public License (LGPL) and is free to download. Hibernate not only takes care of the mapping from Java classes to database tables (and from Java data types to SQL data types), but also provides data query and retrieval facilities. This tutorial will teach you how to use Hibernate to develop your database based web applications in simple and easy steps. Audience This tutorial is designed for Java programmers with a need to understand the Hibernate framework and API. After completing this tutorial you will find yourself at a moderate level of expertise in using Hibernate from where you can take yourself to next levels. Prerequisites We assume you have good understanding of the Java programming language. A basic understanding of relational databases, JDBC and SQL is very helpful. Copyright & Disclaimer Notice  All the content and graphics on this tutorial are the property of tutorialspoint.com. Any content from tutorialspoint.com or this tutorial may not be redistributed or reproduced in any way, shape, or form without the written permission of tutorialspoint.com. Failure to do so is a violation of copyright laws. This tutorial may contain inaccuracies or errors and tutorialspoint provides no guarantee regarding the accuracy of the site or its contents including this tutorial. If you discover that the tutorialspoint.com site or this tutorial content contains some errors, please contact us at webmaster@tutorialspoint.com
  • 4. TUTORIALS POINT Simply Easy Learning Table of Content Hibernate Tutorial .................................................................... 2 Audience.................................................................................. 2 Prerequisites............................................................................ 2 Copyright & Disclaimer Notice.................................................. 2 ORM Overview......................................................................... 8 Pros and Cons of JDBC...................................................................................8 Why Object Relational Mapping (ORM)?.........................................................8 What is ORM? ..............................................................................................9 Java ORM Frameworks................................................................................10 Hibernate Overview ............................................................... 11 Hibernate Advantages.................................................................................11 Supported Databases..................................................................................12 Supported Technologies..............................................................................12 Hibernate Architecture ........................................................... 13 Configuration Object...................................................................................14 SessionFactory Object .................................................................................14 Session Object............................................................................................15 Transaction Object......................................................................................15 Query Object..............................................................................................15 Criteria Object............................................................................................15 Hibernate Environment .......................................................... 16 Downloading Hibernate:..............................................................................16 Installing Hibernate.....................................................................................17 Hibernate Prerequisites...............................................................................17 Hibernate Configuration ......................................................... 18 Hibernate Properties...................................................................................18 Hibernate with MySQL Database..................................................................19 Hibernate Sessions................................................................ 21 Session Interface Methods ..........................................................................22 Hibernate Persistent Class..................................................... 24 A simple POJO example:..............................................................................24 Hibernate Mapping Files ........................................................ 26 Hibernate Mapping Types ...................................................... 29 Primitive types ...........................................................................................29 Date and time types....................................................................................29 Binary and large object types.......................................................................30 JDK-related types........................................................................................30
  • 5. TUTORIALS POINT Simply Easy Learning Hibernate Examples............................................................... 31 Create POJO Classes....................................................................................31 Create Database Tables...............................................................................32 Create Mapping Configuration File ...............................................................32 Create Application Class ..............................................................................33 Compilation and Execution ..........................................................................35 Hibernate O/R Mapping ......................................................... 36 Collections Mappings ............................................................................36 Hibernate Set Mappings..............................................................................36 Define RDBMS Tables ................................................................................37 Define POJO Classes...................................................................................37 Define Hibernate Mapping File ..................................................................39 Create Application Class ............................................................................40 Compilation and Execution........................................................................42 Hibernate SortedSet Mappings ....................................................................43 Define RDBMS Tables ................................................................................43 Define POJO Classes...................................................................................44 Define Hibernate Mapping File ..................................................................45 Create Application Class ............................................................................47 Compilation and Execution........................................................................49 Hibernate List Mappings..............................................................................50 Define RDBMS Tables ................................................................................50 Define POJO Classes...................................................................................51 Define Hibernate Mapping File ..................................................................52 Create Application Class ............................................................................53 Compilation and Execution........................................................................55 Hibernate Bag Mappings .............................................................................57 Define RDBMS Tables ................................................................................57 Define POJO Classes...................................................................................57 Define Hibernate Mapping File ..................................................................58 Create Application Class ............................................................................60 Compilation and Execution........................................................................62 Hibernate Map Mappings ............................................................................63 Define RDBMS Tables ................................................................................63 Define POJO Classes...................................................................................63 Define Hibernate Mapping File ..................................................................65 Create Application Class ............................................................................66 Compilation and Execution........................................................................68 Hibernate SortedMap Mappings ..................................................................69
  • 6. TUTORIALS POINT Simply Easy Learning Define RDBMS Tables ................................................................................69 Define POJO Classes...................................................................................70 Define Hibernate Mapping File ..................................................................71 Compilation and Execution........................................................................75 Association Mappings ...........................................................................76 Hibernate Many-to-One Mappings ...............................................................76 Define RDBMS Tables ................................................................................76 Define POJO Classes...................................................................................77 Define Hibernate Mapping File ..................................................................79 Compilation and Execution........................................................................82 Hibernate One-to-One Mappings .................................................................83 Define RDBMS Tables ................................................................................83 Define POJO Classes...................................................................................84 Define Hibernate Mapping File ..................................................................86 Compilation and Execution........................................................................89 Hibernate One-to-Many Mappings ...............................................................90 Define RDBMS Tables ................................................................................90 Define POJO Classes...................................................................................91 Define Hibernate Mapping File ..................................................................92 Create Application Class ............................................................................93 Compilation and Execution........................................................................95 Hibernate Many-to-Many Mappings.............................................................96 Define RDBMS Tables ................................................................................97 Define POJO Classes...................................................................................97 Define Hibernate Mapping File ..................................................................99 Create Application Class ..........................................................................100 Compilation and Execution......................................................................102 Component Mappings...............................................................................103 Hibernate Component Mappings................................................................103 Define RDBMS Tables ..............................................................................103 Define POJO Classes.................................................................................104 Define Hibernate Mapping File ................................................................106 Create Application Class ..........................................................................107 Compilation and Execution......................................................................109 Hibernate Annotations.......................................................... 111 Environment Setup for Hibernate Annotation..............................................111 Annotated Class Example ..........................................................................111 @Entity Annotation ..................................................................................112 @Table Annotation...................................................................................113
  • 7. TUTORIALS POINT Simply Easy Learning @Id and @GeneratedValue Annotations.....................................................113 @Column Annotation ...............................................................................113 Create Application Class ............................................................................113 Database Configuration.............................................................................115 Compilation and Execution ........................................................................116 Hibernate Query Language.................................................. 117 FROM Clause............................................................................................117 AS Clause.................................................................................................117 SELECT Clause ..........................................................................................118 WHERE Clause..........................................................................................118 ORDER BY Clause ......................................................................................118 GROUP BY Clause......................................................................................118 Using Named Paramters............................................................................119 UPDATE Clause.........................................................................................119 DELETE Clause ..........................................................................................119 INSERT Clause ..........................................................................................119 Aggregate Methods ..................................................................................119 Pagination using Query .............................................................................120 Hibernate Criteria Queries ................................................... 121 Restrictions with Criteria ...........................................................................121 Pagination using Criteria............................................................................122 Sorting the Results....................................................................................123 Projections & Aggregations........................................................................123 Criteria Queries Example ...........................................................................123 Compilation and Execution ........................................................................127 Hibernate Native SQL .......................................................... 128 Scalar queries...........................................................................................128 Entity queries...........................................................................................128 Named SQL queries...................................................................................129 Native SQL Example ..................................................................................129 Compilation and Execution ........................................................................132 Hibernate Caching ............................................................... 133 First-level cache........................................................................................133 Second-level cache ...................................................................................134 Query-level cache.....................................................................................134 The Second Level Cache ............................................................................134 Concurrency strategies..............................................................................134 Cache provider .........................................................................................135 The Query-level Cache ..............................................................................137
  • 8. TUTORIALS POINT Simply Easy Learning Hibernate Batch Processing................................................. 138 Batch Processing Example .........................................................................139 Compilation and Execution ........................................................................142 Hibernate Interceptors.......................................................... 143 How to use Interceptors? ..........................................................................144 Create Interceptors...................................................................................144 Create POJO Classes..................................................................................145 Create Database Tables.............................................................................145 Create Mapping Configuration File .............................................................146 Create Application Class ............................................................................146 Compilation and Execution ........................................................................148
  • 9. TUTORIALS POINT Simply Easy Learning ORM Overview JDBC stands for Java Database Connectivity and provides a set of Java API for accessing the relational databases from Java program. These Java APIs enables Java programs to execute SQL statements and interact with any SQL compliant database. JDBC provides a flexible architecture to write a database independent application that can run on different platforms and interact with different DBMS without any modification. Pros and Cons of JDBC Pros of JDBC Cons of JDBC  Clean and simple SQL processing  Good performance with large data  Very good for small applications  Simple syntax so easy to learn  Complex if it is used in large projects  Large programming overhead  No encapsulation  Hard to implement MVC concept  Query is DBMS specific Why Object Relational Mapping (ORM)? When we work with an object-oriented systems, there's a mismatch between the object model and the relational database. RDBMSs represent data in a tabular format whereas object-oriented languages, such as Java or C# represent it as an interconnected graph of objects. Consider the following Java Class with proper constructors and associated public function: public class Employee { private int id; private String first_name; private String last_name; private int salary; CHAPTER 1
  • 10. TUTORIALS POINT Simply Easy Learning public Employee() {} public Employee(String fname, String lname, int salary) { this.first_name = fname; this.last_name = lname; this.salary = salary; } public int getId() { return id; } public String getFirstName() { return first_name; } public String getLastName() { return last_name; } public int getSalary() { return salary; } } Consider above objects need to be stored and retrieved into the following RDBMS table: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); First problem, what if we need to modify the design of our database after having developed few pages or our application? Second, Loading and storing objects in a relational database exposes us to the following five mismatch problems. Mismatch Description Granularity Sometimes you will have an object model which has more classes than the number of corresponding tables in the database. Inheritance RDBMSs do not define anything similar to Inheritance which is a natural paradigm in object-oriented programming languages. Identity A RDBMS defines exactly one notion of 'sameness': the primary key. Java, however, defines both object identity (a==b) and object equality (a.equals(b)). Associations Object-oriented languages represent associations using object references where as am RDBMS represents an association as a foreign key column. Navigation The ways you access objects in Java and in a RDBMS are fundamentally different. The Object-Relational Mapping (ORM) is the solution to handle all the above impedance mismatches. What is ORM? ORM stands for Object-Relational Mapping (ORM) is a programming technique for converting data between relational databases and object oriented programming languages such as Java, C# etc. An ORM system has following advantages over plain JDBC
  • 11. TUTORIALS POINT Simply Easy Learning S.N. Advantages 1 Lets business code access objects rather than DB tables. 2 Hides details of SQL queries from OO logic. 3 Based on JDBC 'under the hood' 4 No need to deal with the database implementation. 5 Entities based on business concepts rather than database structure. 6 Transaction management and automatic key generation. 7 Fast development of application. An ORM solution consists of the following four entities: S.N. Solutions 1 An API to perform basic CRUD operations on objects of persistent classes. 2 A language or API to specify queries that refer to classes and properties of classes. 3 A configurable facility for specifying mapping metadata. 4 A technique to interact with transactional objects to perform dirty checking, lazy association fetching, and other optimization functions. Java ORM Frameworks There are several persistent frameworks and ORM options in Java. A persistent framework is an ORM service that stores and retrieves objects into a relational database.  Enterprise JavaBeans Entity Beans  Java Data Objects  Castor  TopLink  Spring DAO  Hibernate  And many more
  • 12. TUTORIALS POINT Simply Easy Learning Hibernate Overview Hibernate is an Object-Relational Mapping(ORM) solution for JAVA and it raised as an open source persistent framework created by Gavin King in 2001. It is a powerful, high performance Object-Relational Persistence and Query service for any Java Application. Hibernate maps Java classes to database tables and from Java data types to SQL data types and relieve the developer from 95% of common data persistence related programming tasks. Hibernate sits between traditional Java objects and database server to handle all the work in persisting those objects based on the appropriate O/R mechanisms and patterns. Hibernate Advantages  Hibernate takes care of mapping Java classes to database tables using XML files and without writing any line of code.  Provides simple APIs for storing and retrieving Java objects directly to and from the database.  If there is change in Database or in any table then the only need to change XML file properties.  Abstract away the unfamiliar SQL types and provide us to work around familiar Java Objects.  Hibernate does not require an application server to operate.  Manipulates Complex associations of objects of your database. CHAPTER 2
  • 13. TUTORIALS POINT Simply Easy Learning  Minimize database access with smart fetching strategies.  Provides Simple querying of data. Supported Databases Hibernate supports almost all the major RDBMS. Following is list of few of the database engines supported by Hibernate.  HSQL Database Engine  DB2/NT  MySQL  PostgreSQL  FrontBase  Oracle  Microsoft SQL Server Database  Sybase SQL Server  Informix Dynamic Server Supported Technologies Hibernate supports a variety of other technologies, including the following:  XDoclet Spring  J2EE  Eclipse plug-ins  Maven
  • 14. TUTORIALS POINT Simply Easy Learning Hibernate Architecture The Hibernate architecture is layered to keep you isolated from having to know the underlying APIs. Hibernate makes use of the database and configuration data to provide persistence services (and persistent objects) to the application. Following is a very high level view of the Hibernate Application Architecture. Following is a detailed view of the Hibernate Application Architecture with few important core classes. CHAPTER 3
  • 15. TUTORIALS POINT Simply Easy Learning Hibernate uses various existing Java APIs, like JDBC, Java Transaction API(JTA), and Java Naming and Directory Interface (JNDI). JDBC provides a rudimentary level of abstraction of functionality common to relational databases, allowing almost any database with a JDBC driver to be supported by Hibernate. JNDI and JTA allow Hibernate to be integrated with J2EE application servers. Following section gives brief description of each of the class objects involved in Hibernate Application Architecture. Configuration Object The Configuration object is the first Hibernate object you create in any Hibernate application and usually created only once during application initialization. It represents a configuration or properties file required by the Hibernate. The Configuration object provides two keys components:  Database Connection: This is handled through one or more configuration files supported by Hibernate. These files are hibernate.properties and hibernate.cfg.xml.  Class Mapping Setup: This component creates the connection between the Java classes and database tables. SessionFactory Object Configuration object is used to create a SessionFactory object which inturn configures Hibernate for the application using the supplied configuration file and allows for a Session object to be instantiated. The SessionFactory is a thread safe object and used by all the threads of an application.
  • 16. TUTORIALS POINT Simply Easy Learning The SessionFactory is heavyweight object so usually it is created during application start up and kept for later use. You would need one SessionFactory object per database using a separate configuration file. So if you are using multiple databases then you would have to create multiple SessionFactory objects. Session Object A Session is used to get a physical connection with a database. The Session object is lightweight and designed to be instantiated each time an interaction is needed with the database. Persistent objects are saved and retrieved through a Session object. The session objects should not be kept open for a long time because they are not usually thread safe and they should be created and destroyed them as needed. Transaction Object A Transaction represents a unit of work with the database and most of the RDBMS supports transaction functionality. Transactions in Hibernate are handled by an underlying transaction manager and transaction (from JDBC or JTA). This is an optional object and Hibernate applications may choose not to use this interface, instead managing transactions in their own application code. Query Object Query objects use SQL or Hibernate Query Language (HQL) string to retrieve data from the database and create objects. A Query instance is used to bind query parameters, limit the number of results returned by the query, and finally to execute the query. Criteria Object Criteria object are used to create and execute object oriented criteria queries to retrieve objects.
  • 17. TUTORIALS POINT Simply Easy Learning Hibernate Environment This chapter will explain how to install Hibernate and other associated packages to prepare a develop environment for the Hibernate applications. We will work with MySQL database to experiment with Hibernate examples, so make sure you already have setup for MySQL database. For a more detail on MySQL you can check our MySQL Tutorial. Downloading Hibernate: It is assumed that you already have latest version of Java is installed on your machine. Following are the simple steps to download and install Hibernate on your machine.  Make a choice whether you want to install Hibernate on Windows, or Unix and then proceed to the next step to download .zip file for windows and .tz file for Unix.  Download the latest version of Hibernate from http://www.hibernate.org/downloads.  At the time of writing this tutorial I downloaded hibernate-distribution-3.6.4.Final and when you unzip the downloaded file it will give you directory structure as follows. CHAPTER 4
  • 18. TUTORIALS POINT Simply Easy Learning Installing Hibernate Once you downloaded and unzipped the latest version of the Hibernate Installation file, you need to perform following two simple steps. Make sure you are setting your CLASSPATH variable properly otherwise you will face problem while compiling your application.  Now copy all the library files from /lib into your CLASSPATH, and change your classpath variable to include all the JARs:  Finally copy hibernate3.jar file into your CLASSPATH. This file lies in the root directory of the installation and is the primary JAR that Hibernate needs to do its work. Hibernate Prerequisites Following is the list of the packages/libraries required by Hibernate and you should install them before starting with Hibernate. To install these packages you would have to copy library files from /lib into your CLASSPATH, and change your CLASSPATH variable accordingly. S.N. Packages/Libraries 1 dom4j - XML parsing www.dom4j.org/ 2 Xalan - XSLT Processor http://xml.apache.org/xalan-j/ 3 Xerces - The Xerces Java Parser http://xml.apache.org/xerces-j/ 4 cglib - Appropriate changes to Java classes at runtime http://cglib.sourceforge.net/ 5 log4j - Logging Faremwork http://logging.apache.org/log4j 6 Commons - Logging, Email etc. http://jakarta.apache.org/commons 7 SLF4J - Logging Facade for Java http://www.slf4j.org
  • 19. TUTORIALS POINT Simply Easy Learning Hibernate Configuration Hibernate requires to know in advance where to find the mapping information that defines how your Java classes relate to the database tables. Hibernate also requires a set of configuration settings related to database and other related parameters. All such information is usually supplied as a standard Java properties file called hibernate.properties, or as an XML file named hibernate.cfg.xml. I will consider XML formatted file hibernate.cfg.xml to specify required Hibernate properties in my examples. Most of the properties take their default values and it is not required to specify them in the property file unless it is really required. This file is kept in the root directory of your application's classpath. Hibernate Properties Following is the list of important properties you would require to configure for a databases in a standalone situation: S.N. Properties and Description 1 hibernate.dialect This property makes Hibernate generate the appropriate SQL for the chosen database. 2 hibernate.connection.driver_class The JDBC driver class. 3 hibernate.connection.url The JDBC URL to the database instance. 4 hibernate.connection.username The database username. 5 hibernate.connection.password The database password. 6 hibernate.connection.pool_size Limits the number of connections waiting in the Hibernate database connection pool. 7 hibernate.connection.autocommit Allows autocommit mode to be used for the JDBC connection. If you are using a database along with an application server and JNDI then you would have to configure the following properties: CHAPTER 5
  • 20. TUTORIALS POINT Simply Easy Learning S.N. Properties and Description 1 hibernate.connection.datasource The JNDI name defined in the application server context you are using for the application. 2 hibernate.jndi.class The InitialContext class for JNDI. 3 hibernate.jndi.<JNDIpropertyname> Passes any JNDI property you like to the JNDI InitialContext. 4 hibernate.jndi.url Provides the URL for JNDI. 5 hibernate.connection.username The database username. 6 hibernate.connection.password The database password. Hibernate with MySQL Database MySQL is one of the most popular open-source database systems available today. Let us createhibernate.cfg.xml configuration file and place it in the root of your application's classpath. You would have to make sure that you have testdb database available in your MySQL database and you have a user test available to access the database. The XML configuration file must conform to the Hibernate 3 Configuration DTD, which is available from http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume test is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property> <property name="hibernate.connection.username"> root </property> <property name="hibernate.connection.password"> root123 </property> <!-- List of XML mapping files --> <mapping resource="Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
  • 21. TUTORIALS POINT Simply Easy Learning The above configuration file includes <mapping> tags which are related to hibernate-mapping file and we will see in next chapter what exactly is a hibernate mapping file and how and why do we use it. Following is the list of various important databases dialect property type: Database Dialect Property DB2 org.hibernate.dialect.DB2Dialect HSQLDB org.hibernate.dialect.HSQLDialect HypersonicSQL org.hibernate.dialect.HSQLDialect Informix org.hibernate.dialect.InformixDialect Ingres org.hibernate.dialect.IngresDialect Interbase org.hibernate.dialect.InterbaseDialect Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect MySQL org.hibernate.dialect.MySQLDialect Oracle (any version) org.hibernate.dialect.OracleDialect Oracle 11g org.hibernate.dialect.Oracle10gDialect Oracle 10g org.hibernate.dialect.Oracle10gDialect Oracle 9i org.hibernate.dialect.Oracle9iDialect PostgreSQL org.hibernate.dialect.PostgreSQLDialect Progress org.hibernate.dialect.ProgressDialect SAP DB org.hibernate.dialect.SAPDBDialect Sybase org.hibernate.dialect.SybaseDialect Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect Serial No Class Name Functionality 1 Assert A set of assert methods. 2 TestCase A test case defines the fixture to run multiple tests. 3 TestResult A TestResult collects the results of executing a test case. 4 TestSuite A TestSuite is a Composite of Tests.
  • 22. TUTORIALS POINT Simply Easy Learning Hibernate Sessions ASession is used to get a physical connection with a database. The Session object is lightweight and designed to be instantiated each time an interaction is needed with the database. Persistent objects are saved and retrieved through a Session object. The session objects should not be kept open for a long time because they are not usually thread safe and they should be created and destroyed them as needed. The main function of the Session is to offer create, read and delete operations for instances of mapped entity classes. Instances may exist in one of the following three states at a given point in time:  transient: A new instance of a a persistent class which is not associated with a Session and has no representation in the database and no identifier value is considered transient by Hibernate.  persistent: You can make a transient instance persistent by associating it with a Session. A persistent instance has a representation in the database, an identifier value and is associated with a Session.  detached: Once we close the Hibernate Session, the persistent instance will become a detached instance. A Session instance is serializable if its persistent classes are serializable. A typical transaction should use the following idiom: Session session = factory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); // do some work ... tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } If the Session throws an exception, the transaction must be rolled back and the session must be discarded. CHAPTER 6
  • 23. TUTORIALS POINT Simply Easy Learning Session Interface Methods There are number of methods provided by the Session interface but I'm going to list down few important methods only, which we will use in this tutorial. You can check Hibernate documentation for a complete list of methods associated with Session and SessionFactory. S.N. Session Methods and Description 1 Transaction beginTransaction() Begin a unit of work and return the associated Transaction object. 2 void cancelQuery() Cancel the execution of the current query. 3 void clear() Completely clear the session. 4 Connection close() End the session by releasing the JDBC connection and cleaning up. 5 Criteria createCriteria(Class persistentClass) Create a new Criteria instance, for the given entity class, or a superclass of an entity class. 6 Criteria createCriteria(String entityName) Create a new Criteria instance, for the given entity name. 7 Serializable getIdentifier(Object object) Return the identifier value of the given entity as associated with this session. 8 Query createFilter(Object collection, String queryString) Create a new instance of Query for the given collection and filter string. 9 Query createQuery(String queryString) Create a new instance of Query for the given HQL query string. 10 SQLQuery createSQLQuery(String queryString) Create a new instance of SQLQuery for the given SQL query string. 11 void delete(Object object) Remove a persistent instance from the datastore. 12 void delete(String entityName, Object object) Remove a persistent instance from the datastore. 13 Session get(String entityName, Serializable id) Return the persistent instance of the given named entity with the given identifier, or null if there is no such persistent instance. 14 SessionFactory getSessionFactory() Get the session factory which created this session. 15 void refresh(Object object) Re-read the state of the given instance from the underlying database. 16 Transaction getTransaction() Get the Transaction instance associated with this session. 17 boolean isConnected() Check if the session is currently connected. 18 boolean isDirty() Does this session contain any changes which must be synchronized with the database?
  • 24. TUTORIALS POINT Simply Easy Learning 19 boolean isOpen() Check if the session is still open. 20 Serializable save(Object object) Persist the given transient instance, first assigning a generated identifier. 21 void saveOrUpdate(Object object) Either save(Object) or update(Object) the given instance. 22 void update(Object object) Update the persistent instance with the identifier of the given detached instance. 23 void update(String entityName, Object object) Update the persistent instance with the identifier of the given detached instance.
  • 25. TUTORIALS POINT Simply Easy Learning Hibernate Persistent Class The entire concept of Hibernate is to take the values from Java class attributes and persist them to a database table. A mapping document helps Hibernate in determining how to pull the values from the classes and map them with table and associated fields. Java classes whose objects or instances will be stored in database tables are called persistent classes in Hibernate. Hibernate works best if these classes follow some simple rules, also known as the Plain Old Java Object (POJO) programming model. There are following main rules of persistent classes, however, none of these rules are hard requirements.  All Java classes that will be persisted need a default constructor.  All classes should contain an ID in order to allow easy identification of your objects within Hibernate and the database. This property maps to the primary key column of a database table.  All attributes that will be persisted should be declared private and have getXXX and setXXXmethods defined in the JavaBean style.  A central feature of Hibernate, proxies, depends upon the persistent class being either non-final, or the implementation of an interface that declares all public methods.  All classes that do not extend or implement some specialized classes and interfaces required by the EJB framework. The POJO name is used to emphasize that a given object is an ordinary Java Object, not a special object, and in particular not an Enterprise JavaBean. A simple POJO example: Based on the few rules mentioned above we can define a POJO class as follows: public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} CHAPTER 7
  • 26. TUTORIALS POINT Simply Easy Learning public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } }
  • 27. TUTORIALS POINT Simply Easy Learning Hibernate Mapping Files An Object/relational mappings are usually defined in an XML document. This mapping file instructs Hibernate how to map the defined class or classes to the database tables. Though many Hibernate users choose to write the XML by hand, a number of tools exist to generate the mapping document. These include XDoclet, Middlegen and AndroMDA for advanced Hibernate users. Let us consider our previously defined POJO class whose objects will persist in the table defined in next section. public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } CHAPTER 8
  • 28. TUTORIALS POINT Simply Easy Learning public void setSalary( int salary ) { this.salary = salary; } } There would be one table corresponding to each object you are willing to provide persistence. Consider above objects need to be stored and retrieved into the following RDBMS table: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Based on the two above entities we can define following mapping file which instructs Hibernate how to map the defined class or classes to the database tables. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. Let us see little detail about the mapping elements used in the mapping file:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains all the <class> elements.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up
  • 29. TUTORIALS POINT Simply Easy Learning either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type. There are other attributes and elements available which will be used in a mapping document and I would try to cover as many as possible while discussing other Hibernate related topics.
  • 30. TUTORIALS POINT Simply Easy Learning Hibernate Mapping Types When you prepare a Hibernate mapping document, we have seen that you map Java data types into RDBMS data types. The types declared and used in the mapping files are not Java data types; they are not SQL database types either. These types are called Hibernate mapping types, which can translate from Java to SQL data types and vice versa. This chapter lists down all the basic, date and time, large object, and various other built-in mapping types. Primitive types Mapping type Java type ANSI SQL Type integer int or java.lang.Integer INTEGER long long or java.lang.Long BIGINT short short or java.lang.Short SMALLINT float float or java.lang.Float FLOAT double double or java.lang.Double DOUBLE big_decimal java.math.BigDecimal NUMERIC character java.lang.String CHAR(1) string java.lang.String VARCHAR byte byte or java.lang.Byte TINYINT boolean boolean or java.lang.Boolean BIT yes/no boolean or java.lang.Boolean CHAR(1) ('Y' or 'N') true/false boolean or java.lang.Boolean CHAR(1) ('T' or 'F') Date and time types Mapping type Java type ANSI SQL Type .CHAPTER 9
  • 31. TUTORIALS POINT Simply Easy Learning date java.util.Date or java.sql.Date DATE time java.util.Date or java.sql.Time TIME timestamp java.util.Date or java.sql.Timestamp TIMESTAMP calendar java.util.Calendar TIMESTAMP calendar_date java.util.Calendar DATE Binary and large object types Mapping type Java type ANSI SQL Type binary byte[] VARBINARY (or BLOB) text java.lang.String CLOB serializable any Java class that implements java.io.Serializable VARBINARY (or BLOB) clob java.sql.Clob CLOB blob java.sql.Blob BLOB JDK-related types Mapping type Java type ANSI SQL Type class java.lang.Class VARCHAR locale java.util.Locale VARCHAR timezone java.util.TimeZone VARCHAR currency java.util.Currency VARCHAR
  • 32. TUTORIALS POINT Simply Easy Learning Hibernate Examples Let us try an example of using Hibernate to provide Java persistence in a standalone application. We will go through different steps involved in creating Java Application using Hibernate technology. Create POJO Classes The first step in creating an application is to build the Java POJO class or classes, depending on the application that will be persisted to the database. Let us consider our Employee class with getXXX andsetXXX methods to make it JavaBeans compliant class. A POJO (Plain Old Java Object) is a Java object that doesn't extend or implement some specialized classes and interfaces respectively required by the EJB framework. All normal Java objects are POJO. When you design a classs to be persisted by Hibernate, it's important to provide JavaBeans compliant code as well as one attribute which would work as index like id attribute in the Employee class. public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { CHAPTER 10
  • 33. TUTORIALS POINT Simply Easy Learning return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Create Database Tables Second step would be creating tables in your database. There would be one table corresponding to each object you are willing to provide persistence. Consider above objects need to be stored and retrieved into the following RDBMS table: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Create Mapping Configuration File This step is to create a mapping file that instructs Hibernate how to map the defined class or classes to the database tables. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. Let us see little detail about the mapping document:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains all the <class> elements.
  • 34. TUTORIALS POINT Simply Easy Learning  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type. There are other attributes and elements available which will be used in a mapping document and I would try to cover as many as possible while discussing other Hibernate related topics. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records and then we will apply CRUD operations on those records. import java.util.List; import java.util.Date; import java.util.Iterator; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Add few employee records in database */ Integer empID1 = ME.addEmployee("Zara", "Ali", 1000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 10000); /* List down all the employees */ ME.listEmployees(); /* Update employee's records */ ME.updateEmployee(empID1, 5000);
  • 35. TUTORIALS POINT Simply Easy Learning /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down new list of the employees */ ME.listEmployees(); } /* Method to CREATE an employee in the database */ public Integer addEmployee(String fname, String lname, int salary){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to READ all the employees */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to UPDATE salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to DELETE an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null;
  • 36. TUTORIALS POINT Simply Easy Learning try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result, and records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Zara Last Name: Ali Salary: 1000 First Name: Daisy Last Name: Das Salary: 5000 First Name: John Last Name: Paul Salary: 10000 First Name: Zara Last Name: Ali Salary: 5000 First Name: John Last Name: Paul Salary: 10000 If you check your EMPLOYEE table, it should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 29 | Zara | Ali | 5000 | | 31 | John | Paul | 10000 | +----+------------+-----------+--------+ 2 rows in set (0.00 sec mysql>
  • 37. TUTORIALS POINT Simply Easy Learning Hibernate O/R Mapping So far we have seen very basic O/R mapping using hibernate but there are three most important mapping topics which we have to learn in detail. These are the mapping of collections, the mapping of associations between entity classes and Component Mappings. Collections Mappings If an entity or class has collection of values for a particular variable, then we can map those values using any one of the collection interfaces available in java. Hibernate can persist instances ofjava.util.Map, java.util.Set, java.util.SortedMap, java.util.SortedSet, java.util.List, and any array of persistent entities or values. Collection type Mapping and Description java.util.Set This is mapped with a <set> element and initialized with java.util.HashSet java.util.SortedSet This is mapped with a <set> element and initialized with java.util.TreeSet. The sort attribute can be set to either a comparator or natural ordering. java.util.List This is mapped with a <list> element and initialized with java.util.ArrayList java.util.Collection This is mapped with a <bag> or <ibag> element and initialized with java.util.ArrayList java.util.Map This is mapped with a <map> element and initialized with java.util.HashMap java.util.SortedMap This is mapped with a <map> element and initialized with java.util.TreeMap. The sort attribute can be set to either a comparator or natural ordering. Arrays are supported by Hibernate with <primitive-array> for Java primitive value types and <array> for everything else. However, they are rarely used so I'm not going to discuss them in this tutorial. If you want to map a user defined collection interfaces which is not directly supported by Hibernate, you need to tell Hibernate about the semantics of your custom collections which is not very easy and not recommend to be used. Hibernate Set Mappings A Set is a java collection that does not contain any duplicate element. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. So objects to be added to a set must CHAPTER 11
  • 38. TUTORIALS POINT Simply Easy Learning implement both the equals() and hashCode() methods so that Java can determine whether any two elements/objects are identical. A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set collection in your class when there is no duplicate element required in the collection. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. So we will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects: Define POJO Classes Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in Set variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private Set certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() {
  • 39. TUTORIALS POINT Simply Easy Learning return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Set getCertificates() { return certificates; } public void setCertificates( Set certificates ) { this.certificates = certificates; } } Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. This class should also implement both the equals() and hashCode() methods so that Java can determine whether any two elements/objects are identical. public class Certificate { private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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 boolean equals(Object obj) { if (obj == null) return false; if (!this.getClass().equals(obj.getClass())) return false; Certificate obj2 = (Certificate)obj; if((this.id == obj2.getId()) && (this.name.equals(obj2.getName()))) { return true; } return false; } public int hashCode() { int tmp = 0; tmp = ( id + name ).hashCode();
  • 40. TUTORIALS POINT Simply Easy Learning return tmp; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <set> element will be used to define the rule for Set collection used. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="all"> <key column="employee_id"/> <one-to-many class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.
  • 41. TUTORIALS POINT Simply Easy Learning  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <set> element is new here and has been introduced to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <set> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The nameattribute is set to the defined Set variable in the parent class, in our case it is certificates. For each set variable, we need to define a separate set element in the mapping file.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ HashSet set1 = new HashSet(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ HashSet set2 = new HashSet(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */
  • 42. TUTORIALS POINT Simply Easy Learning ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Set cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Set certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) {
  • 43. TUTORIALS POINT Simply Easy Learning if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MBA Certificate: PMP Certificate: MCA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MBA Certificate: PMP
  • 44. TUTORIALS POINT Simply Easy Learning Certificate: MCA If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from employee; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from certificate; +----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+ | 1 | MBA | 1 | | 2 | PMP | 1 | | 3 | MCA | 1 | +----+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Hibernate SortedSet Mappings A SortedSet is a java collection that does not contain any duplicate element and elements are ordered using their natural ordering or by a comparator provided. A SortedSet is mapped with a <set> element in the mapping table and initialized with java.util.TreeSet. The sort attribute can be set to either a comparator or natural ordering. If we use natural ordering then its iterator will traverse the set in ascending element order. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. So we will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects:
  • 45. TUTORIALS POINT Simply Easy Learning Define POJO Classes Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in SortedSet variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private SortedSet certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public SortedSet getCertificates() { return certificates; } public void setCertificates( SortedSet certificates ) { this.certificates = certificates; } } Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. This class should also implementComparable interface and compareTo method which will be used to sort the elements in case you setsort="natural" in your mapping file (see below mapping file). public class Certificate implements Comparable <Certificate>{
  • 46. TUTORIALS POINT Simply Easy Learning private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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 int compareTo(Certificate that){ final int BEFORE = -1; final int AFTER = 1; if (that == null) { return BEFORE; } Comparable thisCertificate = this.getName(); Comparable thatCertificate = that.getName(); if(thisCertificate == null) { return AFTER; } else if(thatCertificate == null) { return BEFORE; } else { return thisCertificate.compareTo(thatCertificate); } } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <set> element will be used to define the rule for SortedSet collection used. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="all" sort="MyClass"> <key column="employee_id"/>
  • 47. TUTORIALS POINT Simply Easy Learning <one-to-many class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <set> element is used to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <set> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the definedSortedSet variable in the parent class, in our case it is certificates. The sort attribute can be set to natural to have natural sorting or it can be set to a custom class implementingjava.util.Comparator. We have used a class MyClass which implements java.util.Comparator to reverse the sorting order implemented in Certificate class.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement. If we use sort="natural" setting then we do not need to create a separate class because Certificate class already has implemented Comparable interface and hibernate will use compareTo() method defined in Certificate class to compare certificate names. But we are using a custom comparator classMyClass in our mapping file so we would have to create this class based on our sorting algorithm. Let us do descending sorting in this class using this class. import java.util.Comparator;
  • 48. TUTORIALS POINT Simply Easy Learning public class MyClass implements Comparator<Certificate>{ public int compare(Certificate o1, Certificate o2) { final int BEFORE = -1; final int AFTER = 1; /* To reverse the sorting order, multiple by -1 */ if (o2 == null) { return BEFORE * -1; } Comparable thisCertificate = o1.getName(); Comparable thatCertificate = o2.getName(); if(thisCertificate == null) { return AFTER * 1; } else if(thatCertificate == null) { return BEFORE * -1; } else { return thisCertificate.compareTo(thatCertificate) * -1; } } } Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ TreeSet set1 = new TreeSet(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ TreeSet set2 = new TreeSet(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2);
  • 49. TUTORIALS POINT Simply Easy Learning /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, SortedSet cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); SortedSet certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{
  • 50. TUTORIALS POINT Simply Easy Learning tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create MyClass.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your mapping file, simply set sort="natural" and execute your program and compare the results. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: PMP Certificate: MCA
  • 51. TUTORIALS POINT Simply Easy Learning Certificate: MBA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: PMP Certificate: MCA Certificate: MBA If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from employee; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from certificate; +----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+ | 1 | MBA | 1 | | 2 | PMP | 1 | | 3 | MCA | 1 | +----+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Hibernate List Mappings A List is a java collection that stores elements in sequence and allow duplicate elements. The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index, and search for elements in the list. More formally, lists typically allow pairs of elements e1 and e2 such that e1.equals(e2), and they typically allow multiple null elements if they allow null elements at all. A List is mapped with a <list> element in the mapping table and initialized with java.util.ArrayList. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) );
  • 52. TUTORIALS POINT Simply Easy Learning Further, assume each employee can have one or more certificate associated with him/her. A List collection mapping needs an index column in the collection table. The index column defines the position of the element in the collection. So we will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, idx INT default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects. Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in List variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private List certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public List getCertificates() { return certificates;
  • 53. TUTORIALS POINT Simply Easy Learning } public void setCertificates( List certificates ) { this.certificates = certificates; } } We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. public class Certificate{ private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <list> element will be used to define the rule for List collection used. The index of list is always of type integer and is mapped using the <list-index> element. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <list name="certificates" cascade="all"> <key column="employee_id"/> <list-index column="idx"/> <one-to-many class="Certificate"/> </list> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class>
  • 54. TUTORIALS POINT Simply Easy Learning <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <list> element is used to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <list> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the defined Listvariable in the parent class, in our case it is certificates.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <list-index> element is used to keep the position of the element and map with the index column in the collection table. The index of the persistent list starts at zero. You could change this, for example, with <list- index base="1".../> in your mapping.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement. If we changed this example to use a many-to-many relationship, we would need an association table to map between the parent and the child objects. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory;
  • 55. TUTORIALS POINT Simply Easy Learning import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ ArrayList set1 = new ArrayList(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ ArrayList set2 = new ArrayList(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, ArrayList cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null;
  • 56. TUTORIALS POINT Simply Easy Learning try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); List certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.
  • 57. TUTORIALS POINT Simply Easy Learning  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your mapping file, simply set sort="natural" and execute your program and compare the results. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MCA Certificate: MBA Certificate: PMP First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MCA Certificate: MBA Certificate: PMP If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 51 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from CERTIFICATE; +----+------------------+------+-------------+ | id | certificate_name | idx | employee_id | +----+------------------+------+-------------+ | 6 | MCA | 0 | 51 | | 7 | MBA | 1 | 51 | | 8 | PMP | 2 | 51 | +----+------------------+------+-------------+ 3 rows in set (0.00 sec mysql> Alternatively, you could map a Java array instead of a list. A array mapping is virtually identical to the previous example, except with different element and attribute names (<array> and <array-index>). However, for reasons explained earlier, Hibernate applications rarely use arrays.
  • 58. TUTORIALS POINT Simply Easy Learning Hibernate Bag Mappings A Bag is a java collection that stores elements without caring about the sequencing but allow duplicate elements in the list. A bag is a random grouping of the objects in the list. A Collection is mapped with a <bag> element in the mapping table and initialized with java.util.ArrayList. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. We will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects. Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in List variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private Collection certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() {
  • 59. TUTORIALS POINT Simply Easy Learning return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Collection getCertificates() { return certificates; } public void setCertificates( Collection certificates ) { this.certificates = certificates; } } We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. public class Certificate{ private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <bag> element will be used to define the rule for the Collection used. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  • 60. TUTORIALS POINT Simply Easy Learning <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <bag name="certificates" cascade="all"> <key column="employee_id"/> <one-to-many class="Certificate"/> </bag> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <bag> element is used to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <bag> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the definedCollection variable in the parent class, in our case it is certificates.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement.
  • 61. TUTORIALS POINT Simply Easy Learning Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ ArrayList set1 = new ArrayList(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ ArrayList set2 = new ArrayList(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, ArrayList cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert);
  • 62. TUTORIALS POINT Simply Easy Learning employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Collection certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) {
  • 63. TUTORIALS POINT Simply Easy Learning if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. You can see certificates has been sorted in reverse order. You can try by changing your mapping file, simply set sort="natural" and execute your program and compare the results. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MCA Certificate: MBA Certificate: PMP First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MCA Certificate: MBA Certificate: PMP If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 53 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from CERTIFICATE; +----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+
  • 64. TUTORIALS POINT Simply Easy Learning | 11 | MCA | 53 | | 12 | MBA | 53 | | 13 | PMP | 53 | +----+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Hibernate Map Mappings A Map is a java collection that stores elements in key-value pairs and does not allow duplicate elements in the list. The Map interface provides three collection views, which allow a map's contents to be viewed as a set of keys, collection of values, or set of key-value mappings. A Map is mapped with a <map> element in the mapping table and an unordered map can be initialized with java.util.HashMap. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. We will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_type VARCHAR(40) default NULL, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects. Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in List variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName;
  • 65. TUTORIALS POINT Simply Easy Learning private int salary; private Map certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Map getCertificates() { return certificates; } public void setCertificates( Map certificates ) { this.certificates = certificates; } } We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. public class Certificate{ private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getName() {
  • 66. TUTORIALS POINT Simply Easy Learning return name; } public void setName( String name ) { this.name = name; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <map> element will be used to define the rule for the Map used. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <map name="certificates" cascade="all"> <key column="employee_id"/> <index column="certificate_type" type="string"/> <one-to-many class="Certificate"/> </map> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.
  • 67. TUTORIALS POINT Simply Easy Learning  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <map> element is used to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <map> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the defined Mapvariable in the parent class, in our case it is certificates.  The <index> element is used to represents the key parts of the key/value map pair. The key will be stored in the column certificate_type using a type of string.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save an Employee record alongwith a list of certificates and then we will apply CRUD operations on that record. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ HashMap set = new HashMap(); set.put("ComputerScience", new Certificate("MCA")); set.put("BusinessManagement", new Certificate("MBA")); set.put("ProjectManagement", new Certificate("PMP")); /* Add employee records in the database */ Integer empID = ME.addEmployee("Manoj", "Kumar", 4000, set); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID, 5000); /* List down all the employees */ ME.listEmployees(); }
  • 68. TUTORIALS POINT Simply Easy Learning /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, HashMap cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Map ec = employee.getCertificates(); System.out.println("Certificate: " + (((Certificate)ec.get("ComputerScience")).getName())); System.out.println("Certificate: " + (((Certificate)ec.get("BusinessManagement")).getName())); System.out.println("Certificate: " + (((Certificate)ec.get("ProjectManagement")).getName())); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); }
  • 69. TUTORIALS POINT Simply Easy Learning } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MCA Certificate: MBA Certificate: PMP First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MCA Certificate: MBA Certificate: PMP If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary |
  • 70. TUTORIALS POINT Simply Easy Learning +----+------------+-----------+--------+ | 60 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql>select * from CERTIFICATE; +----+--------------------+------------------+-------------+ | id | certificate_type | certificate_name | employee_id | +----+--------------------+------------------+-------------+ | 16 | ProjectManagement | PMP | 60 | | 17 | BusinessManagement | MBA | 60 | | 18 | ComputerScience | MCA | 60 | +----+--------------------+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Hibernate SortedMap Mappings A SortedMap is a similar java collection as Map that stores elements in key-value pairs and provides a total ordering on its keys. Duplicate elements are not allowed in the map. The map is ordered according to the natural ordering of its keys, or by a Comparator typically provided at sorted map creation time. A SortedMap is mapped with a <map> element in the mapping table and an ordered map can be initialized with java.util.TreeMap. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. We will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_type VARCHAR(40) default NULL, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL, PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects.
  • 71. TUTORIALS POINT Simply Easy Learning Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in List variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private SortedMap certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public SortedMap getCertificates() { return certificates; } public void setCertificates( SortedMap certificates ) { this.certificates = certificates; } } We need to define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. This class should also implement Comparable interface and compareTo method which will be used to sort the key elements of the SortedMap in case you set sort="natural" in your mapping file (see below mapping file).
  • 72. TUTORIALS POINT Simply Easy Learning public class Certificate implements Comparable <String>{ private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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 int compareTo(String that){ final int BEFORE = -1; final int AFTER = 1; if (that == null) { return BEFORE; } Comparable thisCertificate = this; Comparable thatCertificate = that; if(thisCertificate == null) { return AFTER; } else if(thatCertificate == null) { return BEFORE; } else { return thisCertificate.compareTo(thatCertificate); } } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <map> element will be used to define the rule for the Map used. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <map name="certificates" cascade="all" sort="MyClass"> <key column="employee_id"/> <index column="certificate_type" type="string"/>
  • 73. TUTORIALS POINT Simply Easy Learning <one-to-many class="Certificate"/> </map> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <map> element is used to set the relationship between Certificate and Employee classes. We used the cascade attribute in the <map> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the definedSortedMap variable in the parent class, in our case it is certificates. The sort attribute can be set to natural to have natural sorting or it can be set to a custom class implementingjava.util.Comparator. We have used a class MyClass which implements java.util.Comparator to reverse the sorting order implemented in Certificate class.  The <index> element is used to represents the key parts of the key/value map pair. The key will be stored in the column certificate_type using a type of string.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects and, as such, the Certificate object must have a Employee parent associated with it. You can use either <one-to- one>, <many-to-one> or <many-to-many> elements based on your requirement. If we use sort="natural" setting then we do not need to create a separate class because Certificate class already has implemented Comparable interface and hibernate will use compareTo() method defined in Certificate class to compare SortedMap keys. But we are using a custom comparator classMyClass in our mapping file so we would have to create this class based on our sorting algorithm. Let us do descending sorting of the keys available in the map. import java.util.Comparator;
  • 74. TUTORIALS POINT Simply Easy Learning public class MyClass implements Comparator <String>{ public int compare(String o1, String o2) { final int BEFORE = -1; final int AFTER = 1; /* To reverse the sorting order, multiple by -1 */ if (o2 == null) { return BEFORE * -1; } Comparable thisCertificate = o1; Comparable thatCertificate = o2; if(thisCertificate == null) { return AFTER * 1; } else if(thatCertificate == null) { return BEFORE * -1; } else { return thisCertificate.compareTo(thatCertificate) * -1; } } } Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ TreeMap set1 = new TreeMap(); set1.put("ComputerScience", new Certificate("MCA")); set1.put("BusinessManagement", new Certificate("MBA")); set1.put("ProjectManagement", new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ TreeMap set2 = new TreeMap(); set2.put("ComputerScience", new Certificate("MCA")); set2.put("BusinessManagement", new Certificate("MBA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000);
  • 75. TUTORIALS POINT Simply Easy Learning /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, TreeMap cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); SortedMap<String, Certificate> map = employee.getCertificates(); for(Map.Entry<String,Certificate> entry : map.entrySet()){ System.out.print("tCertificate Type: " + entry.getKey()); System.out.println(", Name: " + (entry.getValue()).getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary );
  • 76. TUTORIALS POINT Simply Easy Learning session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create MyClass.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. You can see certificates type has been sorted in reverse order. You can try by changing your mapping file, simply set sort="natural" and execute your program and compare the results. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate Type: ProjectManagement, Name: PMP Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBA First Name: Dilip Last Name: Kumar Salary: 3000
  • 77. TUTORIALS POINT Simply Easy Learning Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate Type: ProjectManagement, Name: PMP Certificate Type: ComputerScience, Name: MCA Certificate Type: BusinessManagement, Name: MBA If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 74 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from CERTIFICATE; +----+--------------------+------------------+-------------+ | id | certificate_type | certificate_name | employee_id | +----+--------------------+------------------+-------------+ | 52 | BusinessManagement | MBA | 74 | | 53 | ComputerScience | MCA | 74 | | 54 | ProjectManagement | PMP | 74 | +----+--------------------+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Association Mappings The mapping of associations between entity classes and the relationships between tables is the soul of ORM. Following are the four ways in which the cardinality of the relationship between the objects can be expressed. An association mapping can be unidirectional as well as bidirectional. Mapping type Description Many-to-One Mapping many-to-one relationship using Hibernate One-to-One Mapping one-to-one relationship using Hibernate One-to-Many Mapping one-to-many relationship using Hibernate Many-to-Many Mapping many-to-many relationship using Hibernate Hibernate Many-to-One Mappings A many-to-one association is the most common kind of association where an Object can be associated with multiple objects. For example a same address object can be associated with multiple employee objects. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure:
  • 78. TUTORIALS POINT Simply Easy Learning create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, address INT NOT NULL, PRIMARY KEY (id) ); Further, many employee can have same address, so this association can be presented using many-to-one association. We will store address related information in a separate table which has following structure: create table ADDRESS ( id INT NOT NULL auto_increment, street_name VARCHAR(40) default NULL, city_name VARCHAR(40) default NULL, state_name VARCHAR(40) default NULL, zipcode VARCHAR(10) default NULL, PRIMARY KEY (id) ); Create both the RBDMS tables and keep them ready for the next implementation. Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a variable of Address type. import java.util.*; public class Employee{ private int id; private String firstName; private String lastName; private int salary; private Address address; public Employee() {} public Employee(String fname, String lname, int salary, Address address ) { this.firstName = fname; this.lastName = lname; this.salary = salary; this.address = address; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName;
  • 79. TUTORIALS POINT Simply Easy Learning } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Address getAddress() { return address; } public void setAddress( Address address ) { this.address = address; } } We need to define another POJO class corresponding to ADDRESS table so that address objects can be stored and retrieved into the ADDRESS table. import java.util.*; public class Address{ private int id; private String street; private String city; private String state; private String zipcode; public Address() {} public Address(String street, String city, String state, String zipcode) { this.street = street; this.city = city; this.state = state; this.zipcode = zipcode; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getStreet() { return street; } public void setStreet( String street ) { this.street = street; } public String getCity() { return city; } public void setCity( String city ) { this.city = city; } public String getState() { return state; }
  • 80. TUTORIALS POINT Simply Easy Learning public void setState( String state ) { this.state = state; } public String getZipcode() { return zipcode; } public void setZipcode( String zipcode ) { this.zipcode = zipcode; } } Define Hibernate Mapping File Let us develop our mapping files which instructs Hibernate how to map the defined classes to the database tables. The <many-to-one> element will be used to define the rule to establish a many-to-one relationship between EMPLOYEE and ADDRESS entities. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> <many-to-one name="address" column="address" class="Address" not-null="true"/> </class> <class name="Address" table="ADDRESS"> <meta attribute="class-description"> This class contains the address detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="street" column="street_name" type="string"/> <property name="city" column="city_name" type="string"/> <property name="state" column="state_name" type="string"/> <property name="zipcode" column="zipcode" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.
  • 81. TUTORIALS POINT Simply Easy Learning  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <many-to-one> element is used to set the relationship between EMPLOYEE and ADDRESS entities. The name attribute is set to the defined variable in the parent class, in our case it isaddress. The column attribute is used to set the column name in the parent table EMPLOYEE. Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have one address object */ Address address = ME.addAddress("Kondapur","Hyderabad","AP","532"); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees();
  • 82. TUTORIALS POINT Simply Easy Learning } /* Method to add an address record in the database */ public Address addAddress(String street, String city, String state, String zipcode) { Session session = factory.openSession(); Transaction tx = null; Integer addressID = null; Address address = null; try{ tx = session.beginTransaction(); address = new Address(street, city, state, zipcode); addressID = (Integer) session.save(address); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return address; } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Address address){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary, address); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Address add = employee.getAddress(); System.out.println("Address "); System.out.println("tStreet: " + add.getStreet()); System.out.println("tCity: " + add.getCity()); System.out.println("tState: " + add.getState()); System.out.println("tZipcode: " + add.getZipcode()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally {
  • 83. TUTORIALS POINT Simply Easy Learning session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Address.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and ADDRESS tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........
  • 84. TUTORIALS POINT Simply Easy Learning First Name: Manoj Last Name: Kumar Salary: 4000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Dilip Last Name: Kumar Salary: 3000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Manoj Last Name: Kumar Salary: 5000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+---------+ | id | first_name | last_name | salary | address | +----+------------+-----------+--------+---------+ | 1 | Manoj | Kumar | 5000 | 5 | +----+------------+-----------+--------+---------+ 1 row in set (0.00 sec) mysql> select * from ADDRESS; +----+-------------+-----------+------------+---------+ | id | street_name | city_name | state_name | zipcode | +----+-------------+-----------+------------+---------+ | 1 | Kondapur | Hyderabad | AP | 532 | +----+-------------+-----------+------------+---------+ 1 row in set (0.00 sec) mysql> Hibernate One-to-One Mappings A one-to-one association is similar to many-to-one association with a difference that the column will be set as unique. For example an address object can be associated with a single employee object. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL,
  • 85. TUTORIALS POINT Simply Easy Learning address INT NOT NULL, PRIMARY KEY (id) ); Further, assuming that an address can be associated a single employee only, so this association can be presented using one-to-one association. We will store address related information in a separate table which has following structure: create table ADDRESS ( id INT NOT NULL auto_increment, street_name VARCHAR(40) default NULL, city_name VARCHAR(40) default NULL, state_name VARCHAR(40) default NULL, zipcode VARCHAR(10) default NULL, PRIMARY KEY (id) ); Create both the RBDMS tables and keep them ready for the next implementation. Define POJO Classes Let us implement a POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a variable of Address type. import java.util.*; public class Employee{ private int id; private String firstName; private String lastName; private int salary; private Address address; public Employee() {} public Employee(String fname, String lname, int salary, Address address ) { this.firstName = fname; this.lastName = lname; this.salary = salary; this.address = address; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; }
  • 86. TUTORIALS POINT Simply Easy Learning public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Address getAddress() { return address; } public void setAddress( Address address ) { this.address = address; } } We need to define another POJO class corresponding to ADDRESS table so that address objects can be stored and retrieved into the ADDRESS table. import java.util.*; public class Address{ private int id; private String street; private String city; private String state; private String zipcode; public Address() {} public Address(String street, String city, String state, String zipcode) { this.street = street; this.city = city; this.state = state; this.zipcode = zipcode; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getStreet() { return street; } public void setStreet( String street ) { this.street = street; } public String getCity() { return city; } public void setCity( String city ) { this.city = city; } public String getState() { return state; } public void setState( String state ) { this.state = state; } public String getZipcode() {
  • 87. TUTORIALS POINT Simply Easy Learning return zipcode; } public void setZipcode( String zipcode ) { this.zipcode = zipcode; } } Define Hibernate Mapping File Let us develop our mapping files which instructs Hibernate how to map the defined classes to the database tables. The <many-to-one> element will be used to define the rule to establish a one-to-one relationship between EMPLOYEE and ADDRESS entities but column attribute will be set to uniqueconstraint and rest of the mapping file will remain as it was in case of many-to-one association. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> <many-to-one name="address" column="address" unique="true" class="Address" not-null="true"/> </class> <class name="Address" table="ADDRESS"> <meta attribute="class-description"> This class contains the address detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="street" column="street_name" type="string"/> <property name="city" column="city_name" type="string"/> <property name="state" column="state_name" type="string"/> <property name="zipcode" column="zipcode" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the
  • 88. TUTORIALS POINT Simply Easy Learning column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <many-to-one> element is used to set the relationship between EMPLOYEE and ADDRESS entities. The name attribute is set to the defined variable in the parent class, in our case it isaddress. The column attribute is used to set the column name in the parent table EMPLOYEE which is set to unique so that only one Employee object can be associated with an address object. Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have one address object */ Address address1 = ME.addAddress("Kondapur","Hyderabad","AP","532"); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address1); /* Let us have another address object */ Address address2 = ME.addAddress("Saharanpur","Ambehta","UP","111"); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* List down all the employees */ ME.listEmployees(); } /* Method to add an address record in the database */ public Address addAddress(String street, String city, String state, String zipcode) { Session session = factory.openSession(); Transaction tx = null;
  • 89. TUTORIALS POINT Simply Easy Learning Integer addressID = null; Address address = null; try{ tx = session.beginTransaction(); address = new Address(street, city, state, zipcode); addressID = (Integer) session.save(address); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return address; } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Address address){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary, address); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Address add = employee.getAddress(); System.out.println("Address "); System.out.println("tStreet: " + add.getStreet()); System.out.println("tCity: " + add.getCity()); System.out.println("tState: " + add.getState()); System.out.println("tZipcode: " + add.getZipcode()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null;
  • 90. TUTORIALS POINT Simply Easy Learning try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Address.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and ADDRESS tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Dilip Last Name: Kumar Salary: 3000 Address Street: Saharanpur City: Ambehta State: UP Zipcode: 111 First Name: Manoj Last Name: Kumar Salary: 5000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Dilip Last Name: Kumar Salary: 3000 Address Street: Saharanpur
  • 91. TUTORIALS POINT Simply Easy Learning City: Ambehta State: UP Zipcode: 111 If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+---------+ | id | first_name | last_name | salary | address | +----+------------+-----------+--------+---------+ | 7 | Manoj | Kumar | 5000 | 5 | | 8 | Dilip | Kumar | 3000 | 6 | +----+------------+-----------+--------+---------+ 2 rows in set (0.00 sec) mysql> select * from ADDRESS; +----+-------------+-----------+------------+---------+ | id | street_name | city_name | state_name | zipcode | +----+-------------+-----------+------------+---------+ | 5 | Kondapur | Hyderabad | AP | 532 | | 6 | Saharanpur | Ambehta | UP | 111 | +----+-------------+-----------+------------+---------+ 2 rows in set (0.00 sec) mysql> Hibernate One-to-Many Mappings A One-to-Many mapping can be implemented using a Set java collection that does not contain any duplicate element. We already have seen how to map Set collection in hibernate, so if you already learned Set mapping then you are all set to go with one-to-many mapping. A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set collection in your class when there is no duplicate element required in the collection. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her. So we will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, employee_id INT default NULL,
  • 92. TUTORIALS POINT Simply Easy Learning PRIMARY KEY (id) ); There will be one-to-many relationship between EMPLOYEE and CERTIFICATE objects: Define POJO Classes Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in Set variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private Set certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Set getCertificates() { return certificates; } public void setCertificates( Set certificates ) { this.certificates = certificates; } } Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. This class should also implement both the equals() and hashCode() methods so that Java can determine whether any two elements/objects are identical.
  • 93. TUTORIALS POINT Simply Easy Learning public class Certificate { private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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 boolean equals(Object obj) { if (obj == null) return false; if (!this.getClass().equals(obj.getClass())) return false; Certificate obj2 = (Certificate)obj; if((this.id == obj2.getId()) && (this.name.equals(obj2.getName()))) { return true; } return false; } public int hashCode() { int tmp = 0; tmp = ( id + name ).hashCode(); return tmp; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="all"> <key column="employee_id"/> <one-to-many class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records.
  • 94. TUTORIALS POINT Simply Easy Learning </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <set> element sets the relationship between Certificate and Employee classes. We used the cascade attribute in the <set> element to tell Hibernate to persist the Certificate objects at the same time as the Employee objects. The name attribute is set to the defined Set variable in the parent class, in our case it is certificates. For each set variable, we need to define a separate set element in the mapping file.  The <key> element is the column in the CERTIFICATE table that holds the foreign key to the parent object ie. table EMPLOYEE.  The <one-to-many> element indicates that one Employee object relates to many Certificate objects. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) {
  • 95. TUTORIALS POINT Simply Easy Learning System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ HashSet set1 = new HashSet(); set1.add(new Certificate("MCA")); set1.add(new Certificate("MBA")); set1.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, set1); /* Another set of certificates for the second employee */ HashSet set2 = new HashSet(); set2.add(new Certificate("BCA")); set2.add(new Certificate("BA")); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, set2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Set cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName());
  • 96. TUTORIALS POINT Simply Easy Learning System.out.println(" Salary: " + employee.getSalary()); Set certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.
  • 97. TUTORIALS POINT Simply Easy Learning  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE and CERTIFICATE tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MBA Certificate: PMP Certificate: MCA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: BCA Certificate: BA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MBA Certificate: PMP Certificate: MCA If you check your EMPLOYEE and CERTIFICATE tables, they should have following records: mysql> select * from employee; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec) mysql> select * from certificate; +----+------------------+-------------+ | id | certificate_name | employee_id | +----+------------------+-------------+ | 1 | MBA | 1 | | 2 | PMP | 1 | | 3 | MCA | 1 | +----+------------------+-------------+ 3 rows in set (0.00 sec) mysql> Hibernate Many-to-Many Mappings A Many-to-Many mapping can be implemented using a Set java collection that does not contain any duplicate element. We already have seen how to map Set collection in hibernate, so if you already learned Set mapping then you are all set to go with many-to-many mapping. A Set is mapped with a <set> element in the mapping table and initialized with java.util.HashSet. You can use Set collection in your class when there is no duplicate element required in the collection.
  • 98. TUTORIALS POINT Simply Easy Learning Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Further, assume each employee can have one or more certificate associated with him/her and a similar certificate can be associated with more than one employee. We will store certificate related information in a separate table which has following structure: create table CERTIFICATE ( id INT NOT NULL auto_increment, certificate_name VARCHAR(30) default NULL, PRIMARY KEY (id) ); Now to implement many-to-many relationship between EMPLOYEE and CERTIFICATE objects, we would have to introduce one more intermediate table having Employee ID and Certificate ID as follows: create table EMP_CERT ( employee_id INT NOT NULL, certificate_id INT NOT NULL, PRIMARY KEY (employee_id,certificate_id) ); Define POJO Classes Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table and having a collection of certificates in Set variable. import java.util.*; public class Employee { private int id; private String firstName; private String lastName; private int salary; private Set certificates; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; }
  • 99. TUTORIALS POINT Simply Easy Learning public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } public Set getCertificates() { return certificates; } public void setCertificates( Set certificates ) { this.certificates = certificates; } } Now let us define another POJO class corresponding to CERTIFICATE table so that certificate objects can be stored and retrieved into the CERTIFICATE table. This class should also implement both the equals() and hashCode() methods so that Java can determine whether any two elements/objects are identical. public class Certificate { private int id; private String name; public Certificate() {} public Certificate(String name) { this.name = name; } 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 boolean equals(Object obj) { if (obj == null) return false; if (!this.getClass().equals(obj.getClass())) return false; Certificate obj2 = (Certificate)obj; if((this.id == obj2.getId()) && (this.name.equals(obj2.getName()))) { return true; } return false; } public int hashCode() { int tmp = 0; tmp = ( id + name ).hashCode(); return tmp; } }
  • 100. TUTORIALS POINT Simply Easy Learning Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <set> element will be used to define the rule for many-to-many relationship. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <set name="certificates" cascade="save-update" table="EMP_CERT"> <key column="employee_id"/> <many-to-many column="certificate_id" class="Certificate"/> </set> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <set> element sets the relationship between Certificate and Employee classes. We setcascade attribute to save-update to tell Hibernate to persist the Certificate objects for SAVE i.e. CREATE and UPDATE
  • 101. TUTORIALS POINT Simply Easy Learning operations at the same time as the Employee objects. The name attribute is set to the defined Set variable in the parent class, in our case it is certificates. For each set variable, we need to define a separate set element in the mapping file. Here we used nameattribute to set the intermediate table name to EMP_CERT.  The <key> element is the column in the EMP_CERT table that holds the foreign key to the parent object ie. table EMPLOYEE and links to the certification_id in the CERTIFICATE table.  The <many-to-many> element indicates that one Employee object relates to many Certificate objects and column attributes are used to link intermediate EMP_CERT. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have a set of certificates for the first employee */ HashSet certificates = new HashSet(); certificates.add(new Certificate("MCA")); certificates.add(new Certificate("MBA")); certificates.add(new Certificate("PMP")); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, certificates); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, certificates); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down all the employees */ ME.listEmployees(); } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Set cert){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null;
  • 102. TUTORIALS POINT Simply Easy Learning try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employee.setCertificates(cert); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator1 = employees.iterator(); iterator1.hasNext();){ Employee employee = (Employee) iterator1.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Set certificates = employee.getCertificates(); for (Iterator iterator2 = certificates.iterator(); iterator2.hasNext();){ Certificate certName = (Certificate) iterator2.next(); System.out.println("Certificate: " + certName.getName()); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to delete an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee =
  • 103. TUTORIALS POINT Simply Easy Learning (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create Certificate.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE, EMP_CERT and CERTIFICATE tables. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Certificate: MBA Certificate: PMP Certificate: MCA First Name: Dilip Last Name: Kumar Salary: 3000 Certificate: MBA Certificate: PMP Certificate: MCA First Name: Manoj Last Name: Kumar Salary: 5000 Certificate: MBA Certificate: PMP Certificate: MCA If you check your EMPLOYEE, EMP_CERT and CERTIFICATE tables, they should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 22 | Manoj | Kumar | 5000 | +----+------------+-----------+--------+ 1 row in set (0.00 sec)
  • 104. TUTORIALS POINT Simply Easy Learning mysql> select * from CERTIFICATE; +----+------------------+ | id | certificate_name | +----+------------------+ | 4 | MBA | | 5 | PMP | | 6 | MCA | +----+------------------+ 3 rows in set (0.00 sec) mysql> select * from EMP_CERT; +-------------+----------------+ | employee_id | certificate_id | +-------------+----------------+ | 22 | 4 | | 22 | 5 | | 22 | 6 | +-------------+----------------+ 3 rows in set (0.00 sec) mysql> Component Mappings It is very much possible that an Entity class can have a reference to another class as a member variable. If the referred class does not have it's own life cycle and completely depends on the life cycle of the owning entity class, then the referred class hence therefore is called as the Component class. The mapping of Collection of Components is also possible in a similar way just as the mapping of regular Collections with minor configuration differences. We will see these two mappings in detail with examples. Mapping type Description Component Mappings Mapping for a class having a reference to another class as a member variable. Hibernate Component Mappings A Component mapping is a mapping for a class having a reference to another class as a member variable. We have seen such mapping while having two tables and using <set> element in the mapping file. Now we will use <component> element in the mapping file and a single table would be used to keep the attributes contained inside the class variable. Define RDBMS Tables Consider a situation where we need to store our employee records in EMPLOYEE table which will have following structure: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id)
  • 105. TUTORIALS POINT Simply Easy Learning ); Further, assume each employe will have an address, so let us add address specific fields in the same table as follows: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, street_name VARCHAR(40) default NULL, city_name VARCHAR(40) default NULL, state_name VARCHAR(40) default NULL, zipcode VARCHAR(10) default NULL, PRIMARY KEY (id) ); Define POJO Classes Let us implement our POJO class Employee which will be used to persist the objects related to EMPLOYEE table. import java.util.*; public class Employee implements java.io.Serializable { private int id; private String firstName; private String lastName; private int salary; private Address address; public Employee() {} public Employee(String fname, String lname, int salary, Address address ) { this.firstName = fname; this.lastName = lname; this.salary = salary; this.address = address; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary;
  • 106. TUTORIALS POINT Simply Easy Learning } public void setSalary( int salary ) { this.salary = salary; } public Address getAddress() { return address; } public void setAddress( Address address ) { this.address = address; } } We need to define another POJO class corresponding to ADDRESS entity having address related fields. import java.util.*; public class Address{ private int id; private String street; private String city; private String state; private String zipcode; public Address() {} public Address(String street, String city, String state, String zipcode) { this.street = street; this.city = city; this.state = state; this.zipcode = zipcode; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getStreet() { return street; } public void setStreet( String street ) { this.street = street; } public String getCity() { return city; } public void setCity( String city ) { this.city = city; } public String getState() { return state; } public void setState( String state ) { this.state = state; } public String getZipcode() { return zipcode; } public void setZipcode( String zipcode ) {
  • 107. TUTORIALS POINT Simply Easy Learning this.zipcode = zipcode; } } Define Hibernate Mapping File Let us develop our mapping file which instructs Hibernate how to map the defined classes to the database tables. The <component> element will be used to define the rule for all the fields associated with ADDRESS table. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <component name="address" class="Address"> <property name="street" column="street_name" type="string"/> <property name="city" column="city_name" type="string"/> <property name="state" column="state_name" type="string"/> <property name="zipcode" column="zipcode" type="string"/> </component> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> <class name="Certificate" table="CERTIFICATE"> <meta attribute="class-description"> This class contains the certificate records. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="name" column="certificate_name" type="string"/> </class> </hibernate-mapping> You should save the mapping document in a file with the format <classname>.hbm.xml. We saved our mapping document in the file Employee.hbm.xml. You are already familiar with most of the mapping detail but let us see all the elements of mapping file once again:  The mapping document is an XML document having <hibernate-mapping> as the root element which contains two <class> elements corresponding to each class.  The <class> elements are used to define specific mappings from a Java classes to the database tables. The Java class name is specified using the name attribute of the class element and the database table name is specified using the table attribute.  The <meta> element is optional element and can be used to create the class description.  The <id> element maps the unique ID attribute in class to the primary key of the database table. The name attribute of the id element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.
  • 108. TUTORIALS POINT Simply Easy Learning  The <generator> element within the id element is used to automatically generate the primary key values. Set the class attribute of the generator element is set to native to let hibernate pick up either identity, sequence or hilo algorithm to create primary key depending upon the capabilities of the underlying database.  The <property> element is used to map a Java class property to a column in the database table. The name attribute of the element refers to the property in the class and the column attribute refers to the column in the database table. The type attribute holds the hibernate mapping type, this mapping types will convert from Java to SQL data type.  The <component> element sets the existence of different attributes of Address class inside Employee classes. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records alongwith their certificates and then we will apply CRUD operations on those records. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Let us have one address object */ Address address1 = ME.addAddress("Kondapur","Hyderabad","AP","532"); /* Add employee records in the database */ Integer empID1 = ME.addEmployee("Manoj", "Kumar", 4000, address1); /* Let us have another address object */ Address address2 = ME.addAddress("Saharanpur","Ambehta","UP","111"); /* Add another employee record in the database */ Integer empID2 = ME.addEmployee("Dilip", "Kumar", 3000, address2); /* List down all the employees */ ME.listEmployees(); /* Update employee's salary records */ ME.updateEmployee(empID1, 5000); /* List down all the employees */ ME.listEmployees(); } /* Method to add an address record in the database */ public Address addAddress(String street, String city, String state, String zipcode) { Session session = factory.openSession(); Transaction tx = null; Integer addressID = null;
  • 109. TUTORIALS POINT Simply Easy Learning Address address = null; try{ tx = session.beginTransaction(); address = new Address(street, city, state, zipcode); addressID = (Integer) session.save(address); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return address; } /* Method to add an employee record in the database */ public Integer addEmployee(String fname, String lname, int salary, Address address){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary, address); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to list all the employees detail */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); Address add = employee.getAddress(); System.out.println("Address "); System.out.println("tStreet: " + add.getStreet()); System.out.println("tCity: " + add.getCity()); System.out.println("tState: " + add.getState()); System.out.println("tZipcode: " + add.getZipcode()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to update salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{
  • 110. TUTORIALS POINT Simply Easy Learning tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result on the screen, and same time records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Manoj Last Name: Kumar Salary: 4000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Dilip Last Name: Kumar Salary: 3000 Address Street: Saharanpur City: Ambehta State: UP Zipcode: 111 First Name: Manoj Last Name: Kumar Salary: 5000 Address Street: Kondapur City: Hyderabad State: AP Zipcode: 532 First Name: Dilip Last Name: Kumar Salary: 3000 Address Street: Saharanpur City: Ambehta State: UP
  • 111. TUTORIALS POINT Simply Easy Learning Zipcode: 111 If you check your EMPLOYEE table, it should have following records: mysql> select id, first_name,salary, street_name, state_name from EMPLOYEE; +----+------------+--------+-------------+------------+ | id | first_name | salary | street_name | state_name | +----+------------+--------+-------------+------------+ | 1 | Manoj | 5000 | Kondapur | AP | | 2 | Dilip | 3000 | Saharanpur | UP | +----+------------+--------+-------------+------------+ 2 rows in set (0.00 sec) mysql>
  • 112. TUTORIALS POINT Simply Easy Learning Hibernate Annotations So far you have seen how Hibernate uses XML mapping file for the transformation of data from POJO to database tables and vice versa. Hibernate annotations is the newest way to define mappings without a use of XML file. You can use annotations in addition to or as a replacement of XML mapping metadata. Hibernate Annotations is the powerful way to provide the metadata for the Object and Relational Table mapping. All the metadata is clubbed into the POJO java file along with the code this helps the user to understand the table structure and POJO simultaneously during the development. If you going to make your application portable to other EJB 3 compliant ORM applications, you must use annotations to represent the mapping information but still if you want greater flexibility then you should go with XML-based mappings. Environment Setup for Hibernate Annotation First of all you would have to make sure that you are using JDK 5.0 otherwise you need to upgrade your JDK to JDK 5.0 to take advantage of the native support for annotations. Second, you will need to install the Hibernate 3.x annotations distribution package, available from the sourceforge: (Download Hibernate Annotation) and copy hibernate-annotations.jar, lib/hibernate-comons- annotations.jar and lib/ejb3-persistence.jar from the Hibernate Annotations distribution to your CLASSPATH Annotated Class Example As I mentioned above while working with Hibernate Annotation all the metadata is clubbed into the POJO java file along with the code this helps the user to understand the table structure and POJO simultaneously during the development. Consider we are going to use following EMPLOYEE table to store our objects: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); CHAPTER 12
  • 113. TUTORIALS POINT Simply Easy Learning Following is the mapping of Employee class with annotations to map objects with the defined EMPLOYEE table: import javax.persistence.*; @Entity @Table(name = "EMPLOYEE") public class Employee { @Id @GeneratedValue @Column(name = "id") private int id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "salary") private int salary; public Employee() {} public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Hibernate detects that the @Id annotation is on a field and assumes that it should access properties on an object directly through fields at runtime. If you placed the @Id annotation on the getId() method, you would enable access to properties through getter and setter methods by default. Hence, all other annotations are also placed on either fields or getter methods, following the selected strategy. Following section will explain the annotations used in the above class. @Entity Annotation The EJB 3 standard annotations are contained in the javax.persistence package, so we import this package as the first step. Second we used the @Entity annotation to the Employee class which marks this class as an entity bean, so it must have a no-argument constructor that is visible with at least protected scope.
  • 114. TUTORIALS POINT Simply Easy Learning @Table Annotation The @Table annotation allows you to specify the details of the table that will be used to persist the entity in the database. The @Table annotation provides four attributes, allowing you to override the name of the table, its catalogue, and its schema, and enforce unique constraints on columns in the table. For now we are using just table name which is EMPLOYEE. @Id and @GeneratedValue Annotations Each entity bean will have a primary key, which you annotate on the class with the @Id annotation. The primary key can be a single field or a combination of multiple fields depending on your table structure. By default, the @Id annotation will automatically determine the most appropriate primary key generation strategy to be used but you can override this by applying the @GeneratedValue annotation which takes two parameters strategy and generator which I'm not going to discuss here, so let us use only default the default key generation strategy. Letting Hibernate determine which generator type to use makes your code portable between different databases. @Column Annotation The @Column annotation is used to specify the details of the column to which a field or property will be mapped. You can use column annotation with the following most commonly used attributes:  name attribute permits the name of the column to be explicitly specified.  length attribute permits the size of the column used to map a value particularly for a String value.  nullable attribute permits the column to be marked NOT NULL when the schema is generated.  unique attribute permits the column to be marked as containing only unique values. Create Application Class Finally, we will create our application class with the main() method to run the application. We will use this application to save few Employee's records and then we will apply CRUD operations on those records. import java.util.List; import java.util.Date; import java.util.Iterator; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new AnnotationConfiguration(). configure(). //addPackage("com.xyz") //add package if used. addAnnotatedClass(Employee.class). buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee();
  • 115. TUTORIALS POINT Simply Easy Learning /* Add few employee records in database */ Integer empID1 = ME.addEmployee("Zara", "Ali", 1000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 10000); /* List down all the employees */ ME.listEmployees(); /* Update employee's records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down new list of the employees */ ME.listEmployees(); } /* Method to CREATE an employee in the database */ public Integer addEmployee(String fname, String lname, int salary){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(); employee.setFirstName(fname); employee.setLastName(lname); employee.setSalary(salary); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to READ all the employees */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to UPDATE salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee =
  • 116. TUTORIALS POINT Simply Easy Learning (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary ); session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to DELETE an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Database Configuration Now let us create hibernate.cfg.xml configuration file to define database related parameters. This time we are not going <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume students is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property> <property name="hibernate.connection.username"> root </property> <property name="hibernate.connection.password"> cohondob </property> </session-factory>
  • 117. TUTORIALS POINT Simply Easy Learning </hibernate-configuration> Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Delete Employee.hbm.xml mapping file from the path.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result, and records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Zara Last Name: Ali Salary: 1000 First Name: Daisy Last Name: Das Salary: 5000 First Name: John Last Name: Paul Salary: 10000 First Name: Zara Last Name: Ali Salary: 5000 First Name: John Last Name: Paul Salary: 10000 If you check your EMPLOYEE table, it should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 29 | Zara | Ali | 5000 | | 31 | John | Paul | 10000 | +----+------------+-----------+--------+ 2 rows in set (0.00 sec mysql>
  • 118. TUTORIALS POINT Simply Easy Learning Hibernate Query Language Hibernate Query Language (HQL) is an object-oriented query language, similar to SQL, but instead of operating on tables and columns, HQL works with persistent objects and their properties. HQL queries are translated by Hibernate into conventional SQL queries which in turns perform action on database. Although you can use SQL statements directly with Hibernate using Native SQL but I would recommend to use HQL whenever possible to avoid database portability hassles, and to take advantage of Hibernate's SQL generation and caching strategies. Keywords like SELECT , FROM and WHERE etc. are not case sensitive but properties like table and column names are case sensitive in HQL. FROM Clause You will use FROM clause if you want to load a complete persistent objects into memory. Following is the simple syntax of using FROM clause: String hql = "FROM Employee"; Query query = session.createQuery(hql); List results = query.list(); If you need to fully qualify a class name in HQL, just specify the package and class name as follows: String hql = "FROM com.hibernatebook.criteria.Employee"; Query query = session.createQuery(hql); List results = query.list(); AS Clause The AS clause can be used to assign aliases to the classes in your HQL queries, specially when you have long queries. For instance, our previous simple example would be the following: String hql = "FROM Employee AS E"; Query query = session.createQuery(hql); List results = query.list(); The AS keyword is optional and you can also specify the alias directly after the class name, as follows: CHAPTER 13
  • 119. TUTORIALS POINT Simply Easy Learning String hql = "FROM Employee E"; Query query = session.createQuery(hql); List results = query.list(); SELECT Clause The SELECT clause provides more control over the result set than the from clause. If you want to obtain few properties of objects instead of the complete object, use the SELECT clause. Following is the simple syntax of using SELECT clause to get just first_name field of the Employee object: String hql = "SELECT E.firstName FROM Employee E"; Query query = session.createQuery(hql); List results = query.list(); It is notable here that Employee.firstName is a property of Employee object rather than a field of the EMPLOYEE table. WHERE Clause If you want to narrow the specific objects that are returned from storage, you use the WHERE clause. Following is the simple syntax of using WHERE clause: String hql = "FROM Employee E WHERE E.id = 10"; Query query = session.createQuery(hql); List results = query.list(); ORDER BY Clause To sort your HQL query's results, you will need to use the ORDER BY clause. You can order the results by any property on the objects in the result set either ascending (ASC) or descending (DESC). Following is the simple syntax of using ORDER BY clause: String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC"; Query query = session.createQuery(hql); List results = query.list(); If you wanted to sort by more than one property, you would just add the additional properties to the end of the order by clause, separated by commas as follows: String hql = "FROM Employee E WHERE E.id > 10 " + "ORDER BY E.firstName DESC, E.salary DESC "; Query query = session.createQuery(hql); List results = query.list(); GROUP BY Clause This clause lets Hibernate pull information from the database and group it based on a value of an attribute and, typically, use the result to include an aggregate value. Following is the simple syntax of using GROUP BY clause: String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " + "GROUP BY E.firstName"; Query query = session.createQuery(hql); List results = query.list();
  • 120. TUTORIALS POINT Simply Easy Learning Using Named Paramters Hibernate supports named parameters in its HQL queries. This makes writing HQL queries that accept input from the user easy and you do not have to defend against SQL injection attacks. Following is the simple syntax of using named parameters: String hql = "FROM Employee E WHERE E.id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("employee_id",10); List results = query.list(); UPDATE Clause Bulk updates are new to HQL with Hibernate 3, and deletes work differently in Hibernate 3 than they did in Hibernate 2. The Query interface now contains a method called executeUpdate() for executing HQL UPDATE or DELETE statements. The UPDATE clause can be used to update one or more properties of an one or more objects. Following is the simple syntax of using UPDATE clause: String hql = "UPDATE Employee set salary = :salary " + "WHERE id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("salary", 1000); query.setParameter("employee_id", 10); int result = query.executeUpdate(); System.out.println("Rows affected: " + result); DELETE Clause The DELETE clause can be used to delete one or more objects. Following is the simple syntax of using DELETE clause: String hql = "DELETE FROM Employee " + "WHERE id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("employee_id", 10); int result = query.executeUpdate(); System.out.println("Rows affected: " + result); INSERT Clause HQL supports INSERT INTO clause only where records can be inserted from one object to another object. Following is the simple syntax of using INSERT INTO clause: String hql = "INSERT INTO Employee(firstName, lastName, salary)" + "SELECT firstName, lastName, salary FROM old_employee"; Query query = session.createQuery(hql); int result = query.executeUpdate(); System.out.println("Rows affected: " + result); Aggregate Methods HQL supports a range of aggregate methods, similar to SQL. They work the same way in HQL as in SQL and following is the list of the available functions:
  • 121. TUTORIALS POINT Simply Easy Learning S.N. Functions Description 1 avg(property name) The average of a property's value 2 count(property name or *) The number of times a property occurs in the results 3 max(property name) The maximum value of the property values 4 min(property name) The minimum value of the property values 5 sum(property name) The sum total of the property values The distinct keyword only counts the unique values in the row set. The following query will return only unique count: String hql = "SELECT count(distinct E.firstName) FROM Employee E"; Query query = session.createQuery(hql); List results = query.list(); Pagination using Query There are two methods of the Query interface for pagination. S.N. Method & Description 1 Query setFirstResult(int startPosition) This method takes an integer that represents the first row in your result set, starting with row 0. 2 Query setMaxResults(int maxResult) This method tells Hibernate to retrieve a fixed number maxResults of objects. Using above two methods together, we can construct a paging component in our web or Swing application. Following is the example which you can extend to fetch 10 rows at a time: String hql = "FROM Employee"; Query query = session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(10); List results = query.list();
  • 122. TUTORIALS POINT Simply Easy Learning Hibernate Criteria Queries Hibernate provides alternate ways of manipulating objects and in turn data available in RDBMS tables. One of the methods is Criteria API which allows you to build up a criteria query object programmatically where you can apply filtration rules and logical conditions. The Hibernate Session interface provides createCriteria() method which can be used to create aCriteria object that returns instances of the persistence object's class when your application executes a criteria query. Following is the simplest example of a criteria query is one which will simply return every object that corresponds to the Employee class. Criteria cr = session.createCriteria(Employee.class); List results = cr.list(); Restrictions with Criteria You can use add() method available for Criteria object to add restriction for a criteria query. Following is the example to add a restriction to return the records with salary is equal to 2000: Criteria cr = session.createCriteria(Employee.class); cr.add(Restrictions.eq("salary", 2000)); List results = cr.list(); Following are the few more examples covering different scenarios and can be used as per requirement: Criteria cr = session.createCriteria(Employee.class); // To get records having salary more than 2000 cr.add(Restrictions.gt("salary", 2000)); // To get records having salary less than 2000 cr.add(Restrictions.lt("salary", 2000)); // To get records having fistName starting with zara cr.add(Restrictions.like("firstName", "zara%")); // Case sensitive form of the above restriction. CHAPTER 14
  • 123. TUTORIALS POINT Simply Easy Learning cr.add(Restrictions.ilike("firstName", "zara%")); // To get records having salary in between 1000 and 2000 cr.add(Restrictions.between("salary", 1000, 2000)); // To check if the given property is null cr.add(Restrictions.isNull("salary")); // To check if the given property is not null cr.add(Restrictions.isNotNull("salary")); // To check if the given property is empty cr.add(Restrictions.isEmpty("salary")); // To check if the given property is not empty cr.add(Restrictions.isNotEmpty("salary")); You can create AND or OR conditions using LogicalExpression restrictions as follows: Criteria cr = session.createCriteria(Employee.class); Criterion salary = Restrictions.gt("salary", 2000); Criterion name = Restrictions.ilike("firstNname","zara%"); // To get records matching with OR condistions LogicalExpression orExp = Restrictions.or(salary, name); cr.add( orExp ); // To get records matching with AND condistions LogicalExpression andExp = Restrictions.and(salary, name); cr.add( andExp ); List results = cr.list(); Though all the above conditions can be used directly with HQL as explained in previous tutorial. Pagination using Criteria There are two methods of the Criteria interface for pagination. S.N. Method & Description 1 public Criteria setFirstResult(int firstResult) This method takes an integer that represents the first row in your result set, starting with row 0. 2 public Criteria setMaxResults(int maxResults) This method tells Hibernate to retrieve a fixed number maxResults of objects. Using above two methods together, we can construct a paging component in our web or Swing application. Following is the example which you can extend to fetch 10 rows at a time: Criteria cr = session.createCriteria(Employee.class); cr.setFirstResult(1); cr.setMaxResults(10); List results = cr.list();
  • 124. TUTORIALS POINT Simply Easy Learning Sorting the Results The Criteria API provides the org.hibernate.criterion.Order class to sort your result set in either ascending or descending order, according to one of your object's properties. This example demonstrates how you would use the Order class to sort the result set: Criteria cr = session.createCriteria(Employee.class); // To get records having salary more than 2000 cr.add(Restrictions.gt("salary", 2000)); // To sort records in descening order crit.addOrder(Order.desc("salary")); // To sort records in ascending order crit.addOrder(Order.asc("salary")); List results = cr.list(); Projections & Aggregations The Criteria API provides the org.hibernate.criterion.Projections class which can be used to get average, maximum or minimum of the property values. The Projections class is similar to the Restrictions class in that it provides several static factory methods for obtaining Projection instances. Following are the few examples covering different scenarios and can be used as per requirement: Criteria cr = session.createCriteria(Employee.class); // To get total row count. cr.setProjection(Projections.rowCount()); // To get average of a property. cr.setProjection(Projections.avg("salary")); // To get distinct count of a property. cr.setProjection(Projections.countDistinct("firstName")); // To get maximum of a property. cr.setProjection(Projections.max("salary")); // To get minimum of a property. cr.setProjection(Projections.min("salary")); // To get sum of a property. cr.setProjection(Projections.sum("salary")); Criteria Queries Example Consider the following POJO class: public class Employee { private int id; private String firstName;
  • 125. TUTORIALS POINT Simply Easy Learning private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Let us create the following EMPLOYEE table to store Employee objects: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Following will be mapping file. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id>
  • 126. TUTORIALS POINT Simply Easy Learning <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> Finally, we will create our application class with the main() method to run the application where we will use Criteria queries: import java.util.List; import java.util.Date; import java.util.Iterator; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Projections; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Add few employee records in database */ Integer empID1 = ME.addEmployee("Zara", "Ali", 2000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 5000); Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000); /* List down all the employees */ ME.listEmployees(); /* Print Total employee's count */ ME.countEmployee(); /* Print Toatl salary */ ME.totalSalary(); } /* Method to CREATE an employee in the database */ public Integer addEmployee(String fname, String lname, int salary){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; }
  • 127. TUTORIALS POINT Simply Easy Learning /* Method to READ all the employees having salary more than 2000 */ public void listEmployees( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Criteria cr = session.createCriteria(Employee.class); // Add restriction. cr.add(Restrictions.gt("salary", 2000)); List employees = cr.list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to print total number of records */ public void countEmployee(){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Criteria cr = session.createCriteria(Employee.class); // To get total row count. cr.setProjection(Projections.rowCount()); List rowCount = cr.list(); System.out.println("Total Coint: " + rowCount.get(0) ); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to print sum of salaries */ public void totalSalary(){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Criteria cr = session.createCriteria(Employee.class); // To get total salary. cr.setProjection(Projections.sum("salary")); List totalSalary = cr.list(); System.out.println("Total Salary: " + totalSalary.get(0) ); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } }
  • 128. TUTORIALS POINT Simply Easy Learning } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result, and records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Daisy Last Name: Das Salary: 5000 First Name: John Last Name: Paul Salary: 5000 First Name: Mohd Last Name: Yasee Salary: 3000 Total Coint: 4 Total Salary: 15000 If you check your EMPLOYEE table, it should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 14 | Zara | Ali | 2000 | | 15 | Daisy | Das | 5000 | | 16 | John | Paul | 5000 | | 17 | Mohd | Yasee | 3000 | +----+------------+-----------+--------+ 4 rows in set (0.00 sec) mysql>
  • 129. TUTORIALS POINT Simply Easy Learning Hibernate Native SQL You can use native SQL to express database queries if you want to utilize database-specific features such as query hints or the CONNECT keyword in Oracle. Hibernate 3.x allows you to specify handwritten SQL, including stored procedures, for all create, update, delete, and load operations. Your application will create a native SQL query from the session with the createSQLQuery() method on the Session interface: public SQLQuery createSQLQuery(String sqlString) throws HibernateException After you pass a string containing the SQL query to the createSQLQuery() method, you can associate the SQL result with either an existing Hibernate entity, a join, or a scalar result using addEntity(), addJoin(), and addScalar() methods respectively. Scalar queries The most basic SQL query is to get a list of scalars (values) from one or more tables. Following is the syntax for using native SQL for scalar values: String sql = "SELECT first_name, salary FROM EMPLOYEE"; SQLQuery query = session.createSQLQuery(sql); query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); List results = query.list(); Entity queries The above queries were all about returning scalar values, basically returning the "raw" values from the resultset. The following is the syntax to get entity objects as a whole from a native sql query via addEntity(). String sql = "SELECT * FROM EMPLOYEE"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(Employee.class); List results = query.list(); CHAPTER 15
  • 130. TUTORIALS POINT Simply Easy Learning Named SQL queries The following is the syntax to get entity objects from a native sql query via addEntity() and using named SQL query. String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(Employee.class); query.setParameter("employee_id", 10); List results = query.list(); Native SQL Example Consider the following POJO class: public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Let us create the following EMPLOYEE table to store Employee objects:
  • 131. TUTORIALS POINT Simply Easy Learning create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Following will be mapping file. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> Finally, we will create our application class with the main() method to run the application where we will use Native SQL queries: import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.SQLQuery; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Add few employee records in database */ Integer empID1 = ME.addEmployee("Zara", "Ali", 2000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 5000); Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000); /* List down employees and their salary using Scalar Query */ ME.listEmployeesScalar(); /* List down complete employees information using Entity Query */
  • 132. TUTORIALS POINT Simply Easy Learning ME.listEmployeesEntity(); } /* Method to CREATE an employee in the database */ public Integer addEmployee(String fname, String lname, int salary){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to READ all the employees using Scalar Query */ public void listEmployeesScalar( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); String sql = "SELECT first_name, salary FROM EMPLOYEE"; SQLQuery query = session.createSQLQuery(sql); query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); List data = query.list(); for(Object object : data) { Map row = (Map)object; System.out.print("First Name: " + row.get("first_name")); System.out.println(", Salary: " + row.get("salary")); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to READ all the employees using Entity Query */ public void listEmployeesEntity( ){ Session session = factory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); String sql = "SELECT * FROM EMPLOYEE"; SQLQuery query = session.createSQLQuery(sql); query.addEntity(Employee.class); List employees = query.list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback();
  • 133. TUTORIALS POINT Simply Easy Learning e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result, and records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ First Name: Zara, Salary: 2000 First Name: Daisy, Salary: 5000 First Name: John, Salary: 5000 First Name: Mohd, Salary: 3000 First Name: Zara Last Name: Ali Salary: 2000 First Name: Daisy Last Name: Das Salary: 5000 First Name: John Last Name: Paul Salary: 5000 First Name: Mohd Last Name: Yasee Salary: 3000 If you check your EMPLOYEE table, it should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 26 | Zara | Ali | 2000 | | 27 | Daisy | Das | 5000 | | 28 | John | Paul | 5000 | | 29 | Mohd | Yasee | 3000 | +----+------------+-----------+--------+ 4 rows in set (0.00 sec) mysql>
  • 134. TUTORIALS POINT Simply Easy Learning Hibernate Caching Caching is all about application performance optimization and it sits between your application and the database to avoid the number of database hits as many as possible to give a better performance for performance critical applications. Caching is important to Hibernate as well which utilizes a multilevel caching schemes as explained below: First-level cache The first-level cache is the Session cache and is a mandatory cache through which all requests must pass. The Session object keeps an object under its own power before committing it to the database. CHAPTER 16
  • 135. TUTORIALS POINT Simply Easy Learning If you issue multiple updates to an object, Hibernate tries to delay doing the update as long as possible to reduce the number of update SQL statements issued. If you close the session, all the objects being cached are lost and either persisted or updated in the database. Second-level cache Second level cache is an optional cache and first-level cache will always be consulted before any attempt is made to locate an object in the second-level cache. The second-level cache can be configured on a per-class and per- collection basis and mainly responsible for caching objects across sessions. Any third-party cache can be used with Hibernate. An org.hibernate.cache.CacheProvider interface is provided, which must be implemented to provide Hibernate with a handle to the cache implementation. Query-level cache Hibernate also implements a cache for query resultsets that integrates closely with the second-level cache. This is an optional feature and requires two additional physical cache regions that hold the cached query results and the timestamps when a table was last updated. This is only useful for queries that are run frequently with the same parameters. The Second Level Cache Hibernate uses first-level cache by default and you have nothing to do to use first-level cache. Let's go straight to the optional second-level cache. Not all classes benefit from caching, so it's important to be able to disable the second-level cache The Hibernate second-level cache is set up in two steps. First, you have to decide which concurrency strategy to use. After that, you configure cache expiration and physical cache attributes using the cache provider. Concurrency strategies A concurrency strategy is a mediator which responsible for storing items of data in the cache and retrieving them from the cache. If you are going to enable a second-level cache, you will have to decide, for each persistent class and collection, which cache concurrency strategy to use.  Transactional: Use this strategy for read-mostly data where it is critical to prevent stale data in concurrent transactions,in the rare case of an update.  Read-write: Again use this strategy for read-mostly data where it is critical to prevent stale data in concurrent transactions,in the rare case of an update.  Nonstrict-read-write: This strategy makes no guarantee of consistency between the cache and the database. Use this strategy if data hardly ever changes and a small likelihood of stale data is not of critical concern.  Read-only: A concurrency strategy suitable for data which never changes. Use it for reference data only. If we are going to use second-level caching for our Employee class, let us add the mapping element required to tell Hibernate to cache Employee instances using read-write strategy. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE">
  • 136. TUTORIALS POINT Simply Easy Learning <meta attribute="class-description"> This class contains the employee detail. </meta> <cache usage="read-write"/> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> The usage="read-write" attribute tells Hibernate to use a read-write concurrency strategy for the defined cache. Cache provider Your next step after considering the concurrency strategies you will use for your cache candidate classes is to pick a cache provider. Hibernate forces you to choose a single cache provider for the whole application. S.N. Cache Name Description 1 EHCache It can cache in memory or on disk and clustered caching and it supports the optional Hibernate query result cache. 2 OSCache Supports caching to memory and disk in a single JVM, with a rich set of expiration policies and query cache support. 3 warmCache A cluster cache based on JGroups. It uses clustered invalidation but doesn't support the Hibernate query cache 4 JBoss Cache A fully transactional replicated clustered cache also based on the JGroups multicast library. It supports replication or invalidation, synchronous or asynchronous communication, and optimistic and pessimistic locking. The Hibernate query cache is supported Every cache provider is not compatible with every concurrency strategy. The following compatibility matrix will help you choose an appropriate combination. Strategy/Provider Read-only Nonstrictread-write Read-write Transaction al EHCache X X X OSCache X X X SwarmCache X X JBoss Cache X X You will specify a cache provider in hibernate.cfg.xml configuration file. We choose EHCache as our second-level cache provider: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  • 137. TUTORIALS POINT Simply Easy Learning <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume students is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property> <property name="hibernate.connection.username"> root </property> <property name="hibernate.connection.password"> root123 </property> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!-- List of XML mapping files --> <mapping resource="Employee.hbm.xml"/> </session-factory> </hibernate-configuration> Now, you need to specify the properties of the cache regions. EHCache has its own configuration file,ehcache.xml, which should be in the CLASSPATH of the application. A cache configuration in ehcache.xml for the Employee class may look like this: <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> <cache name="Employee" maxElementsInMemory="500" eternal="true" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" /> That's it, now we have second-level caching enabled for the Employee class and Hibernate now hits the second- level cache whenever you navigate to a Employee or when you load a Employee by identifier. You should analyze your all the classes and choose appropriate caching strategy for each of the classes. Sometime, second-level caching may downgrade the performance of the application. So it is recommended to benchmark your application first without enabling caching and later on enable your well suited caching and check the performance. If caching is not improving system performance then there is no point in enabling any type of caching.
  • 138. TUTORIALS POINT Simply Easy Learning The Query-level Cache To use the query cache, you must first activate it using the hibernate.cache.use_query_cache="true"property in the configuration file. By setting this property to true, you make Hibernate create the necessary caches in memory to hold the query and identifier sets. Next, to use the query cache, you use the setCacheable(Boolean) method of the Query class. For example: Session session = SessionFactory.openSession(); Query query = session.createQuery("FROM EMPLOYEE"); query.setCacheable(true); List users = query.list(); SessionFactory.closeSession(); Hibernate also supports very fine-grained cache support through the concept of a cache region. A cache region is part of the cache that's given a name. Session session = SessionFactory.openSession(); Query query = session.createQuery("FROM EMPLOYEE"); query.setCacheable(true); query.setCacheRegion("employee"); List users = query.list(); SessionFactory.closeSession(); This code uses the method to tell Hibernate to store and look for the query in the employee area of the cache.
  • 139. TUTORIALS POINT Simply Easy Learning Hibernate Batch Processing Consider a situation when you need to upload a large number of records into your database using Hibernate. Following is the code snippet to achieve this using Hibernate: Session session = SessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Employee employee = new Employee(.....); session.save(employee); } tx.commit(); session.close(); Because by default, Hibernate will cache all the persisted objects in the session-level cache and ultimately your application would fall over with an OutOfMemoryException somewhere around the 50,000th row. You can resolve this problem if you are using batch processing with Hibernate. To use the batch processing feature, first set hibernate.jdbc.batch_size as batch size to a number either at 20 or 50 depending on object size. This will tell the hibernate container that every X rows to be inserted as batch. To implement this in your code we would need to do little modification as follows: Session session = SessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Employee employee = new Employee(.....); session.save(employee); if( i % 50 == 0 ) { // Same as the JDBC batch size //flush a batch of inserts and release memory: session.flush(); session.clear(); } } tx.commit(); session.close(); Above code will work fine for the INSERT operation, but if you are willing to make UPDATE operation then you can achieve using the following code: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); CHAPTER 17
  • 140. TUTORIALS POINT Simply Easy Learning ScrollableResults employeeCursor = session.createQuery("FROM EMPLOYEE") .scroll(); int count = 0; while ( employeeCursor.next() ) { Employee employee = (Employee) employeeCursor.get(0); employee.updateEmployee(); seession.update(employee); if ( ++count % 50 == 0 ) { session.flush(); session.clear(); } } tx.commit(); session.close(); Batch Processing Example Let us modify configuration file as to add hibernate.jdbc.batch_size property: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- Assume students is the database name --> <property name="hibernate.connection.url"> jdbc:mysql://localhost/test </property> <property name="hibernate.connection.username"> root </property> <property name="hibernate.connection.password"> root123 </property> <property name="hibernate.jdbc.batch_size"> 50 </property> <!-- List of XML mapping files --> <mapping resource="Employee.hbm.xml"/> </session-factory> </hibernate-configuration> Consider the following POJO Employee class:
  • 141. TUTORIALS POINT Simply Easy Learning public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Let us create the following EMPLOYEE table to store Employee objects: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Following will be mapping file to map Employee objects with EMPLOYEE table. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta>
  • 142. TUTORIALS POINT Simply Easy Learning <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> Finally, we will create our application class with the main() method to run the application where we will use flush() and clear() methods available with Session object so that Hibernate keep writing these records into the database instead of caching them in the memory. import java.util.*; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); } ManageEmployee ME = new ManageEmployee(); /* Add employee records in batches */ ME.addEmployees( ); } /* Method to create employee records in batches */ public void addEmployees( ){ Session session = factory.openSession(); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { String fname = "First Name " + i; String lname = "Last Name " + i; Integer salary = i; Employee employee = new Employee(fname, lname, salary); session.save(employee); if( i % 50 == 0 ) { session.flush(); session.clear(); } } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return ; } }
  • 143. TUTORIALS POINT Simply Easy Learning Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained above.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program which will create 100000 records in EMPLOYEE table.
  • 144. TUTORIALS POINT Simply Easy Learning Hibernate Interceptors As you have learnt that in Hibernate, an object will be created and persisted. Once the object has been changed, it must be saved back to the database. This process continues until the next time the object is needed, and it will be loaded from the persistent store. Thus an object passes through different stages in its life cycle and Interceptor Interface provides methods which can be called at different stages to perform some required tasks. These methods are callbacks from the session to the application, allowing the application to inspect and/or manipulate properties of a persistent object before it is saved, updated, deleted or loaded. Following is the list of all the methods available within the Interceptor interface: S.N. Method and Description 1 findDirty() This method is be called when the flush() method is called on a Session object. 2 instantiate() This method is called when a persisted class is instantiated. 3 isUnsaved() This method is called when an object is passed to the saveOrUpdate() method/ 4 onDelete() This method is called before an object is deleted. 5 onFlushDirty() This method is called when Hibernate detects that an object is dirty (ie. have been changed) during a flush i.e. update operation. 6 onLoad() This method is called before an object is initialized. 7 onSave() This method is called before an object is saved. 8 postFlush() This method is called after a flush has occurred and an object has been updated in memory. 9 preFlush() This method is called before a flush. Hibernate Interceptor gives us total control over how an object will look to both the application and the database. CHAPTER 18
  • 145. TUTORIALS POINT Simply Easy Learning How to use Interceptors? To build an interceptor you can either implement Interceptor class directly or extend EmptyInterceptorclass. Following will be the simple steps to use Hibernate Interceptor functionality. Create Interceptors We will extend EmptyInterceptor in our example where Interceptor's method will be called automatically when Employee object is created and updated. You can implement more methods as per your requirements. import java.io.Serializable; import java.util.Date; import java.util.Iterator; import org.hibernate.EmptyInterceptor; import org.hibernate.Transaction; import org.hibernate.type.Type; public class MyInterceptor extends EmptyInterceptor { private int updates; private int creates; private int loads; public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // do nothing } // This method is called when Employee object gets updated. public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { if ( entity instanceof Employee ) { System.out.println("Update Operation"); return true; } return false; } public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { // do nothing return true; } // This method is called when Employee object gets created. public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if ( entity instanceof Employee ) { System.out.println("Create Operation"); return true; } return false; } //called before commit into database public void preFlush(Iterator iterator) { System.out.println("preFlush");
  • 146. TUTORIALS POINT Simply Easy Learning } //called after committed into database public void postFlush(Iterator iterator) { System.out.println("postFlush"); } } Create POJO Classes Now let us modify a little bit our first example where we used EMPLOYEE table and Employee class to play with: public class Employee { private int id; private String firstName; private String lastName; private int salary; public Employee() {} public Employee(String fname, String lname, int salary) { this.firstName = fname; this.lastName = lname; this.salary = salary; } public int getId() { return id; } public void setId( int id ) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName( String first_name ) { this.firstName = first_name; } public String getLastName() { return lastName; } public void setLastName( String last_name ) { this.lastName = last_name; } public int getSalary() { return salary; } public void setSalary( int salary ) { this.salary = salary; } } Create Database Tables Second step would be creating tables in your database. There would be one table corresponding to each object you are willing to provide persistence. Consider above objects need to be stored and retrieved into the following RDBMS table: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL,
  • 147. TUTORIALS POINT Simply Easy Learning last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Create Mapping Configuration File This step is to create a mapping file that instructs Hibernate how to map the defined class or classes to the database tables. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Employee" table="EMPLOYEE"> <meta attribute="class-description"> This class contains the employee detail. </meta> <id name="id" type="int" column="id"> <generator class="native"/> </id> <property name="firstName" column="first_name" type="string"/> <property name="lastName" column="last_name" type="string"/> <property name="salary" column="salary" type="int"/> </class> </hibernate-mapping> Create Application Class Finally, we will create our application class with the main() method to run the application. Here it should be noted that while creating session object we used our Interceptor class as an argument. import java.util.List; import java.util.Date; import java.util.Iterator; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ManageEmployee { private static SessionFactory factory; public static void main(String[] args) { try{ factory = new Configuration().configure().buildSessionFactory(); }catch (Throwable ex) { System.err.println("Failed to create sessionFactory object." + ex); throw new ExceptionInInitializerError(ex); }
  • 148. TUTORIALS POINT Simply Easy Learning ManageEmployee ME = new ManageEmployee(); /* Add few employee records in database */ Integer empID1 = ME.addEmployee("Zara", "Ali", 1000); Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); Integer empID3 = ME.addEmployee("John", "Paul", 10000); /* List down all the employees */ ME.listEmployees(); /* Update employee's records */ ME.updateEmployee(empID1, 5000); /* Delete an employee from the database */ ME.deleteEmployee(empID2); /* List down new list of the employees */ ME.listEmployees(); } /* Method to CREATE an employee in the database */ public Integer addEmployee(String fname, String lname, int salary){ Session session = factory.openSession( new MyInterceptor() ); Transaction tx = null; Integer employeeID = null; try{ tx = session.beginTransaction(); Employee employee = new Employee(fname, lname, salary); employeeID = (Integer) session.save(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } return employeeID; } /* Method to READ all the employees */ public void listEmployees( ){ Session session = factory.openSession( new MyInterceptor() ); Transaction tx = null; try{ tx = session.beginTransaction(); List employees = session.createQuery("FROM Employee").list(); for (Iterator iterator = employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next(); System.out.print("First Name: " + employee.getFirstName()); System.out.print(" Last Name: " + employee.getLastName()); System.out.println(" Salary: " + employee.getSalary()); } tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to UPDATE salary for an employee */ public void updateEmployee(Integer EmployeeID, int salary ){ Session session = factory.openSession( new MyInterceptor() ); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); employee.setSalary( salary );
  • 149. TUTORIALS POINT Simply Easy Learning session.update(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } /* Method to DELETE an employee from the records */ public void deleteEmployee(Integer EmployeeID){ Session session = factory.openSession( new MyInterceptor() ); Transaction tx = null; try{ tx = session.beginTransaction(); Employee employee = (Employee)session.get(Employee.class, EmployeeID); session.delete(employee); tx.commit(); }catch (HibernateException e) { if (tx!=null) tx.rollback(); e.printStackTrace(); }finally { session.close(); } } } Compilation and Execution Here are the steps to compile and run the above mentioned application. Make sure you have set PATH and CLASSPATH appropriately before proceeding for the compilation and execution.  Create hibernate.cfg.xml configuration file as explained in configuration chapter.  Create Employee.hbm.xml mapping file as shown above.  Create Employee.java source file as shown above and compile it.  Create MyInterceptor.java source file as shown above and compile it.  Create ManageEmployee.java source file as shown above and compile it.  Execute ManageEmployee binary to run the program. You would get following result, and records would be created in EMPLOYEE table. $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........ Create Operation preFlush postFlush Create Operation preFlush postFlush Create Operation preFlush postFlush First Name: Zara Last Name: Ali Salary: 1000 First Name: Daisy Last Name: Das Salary: 5000
  • 150. TUTORIALS POINT Simply Easy Learning First Name: John Last Name: Paul Salary: 10000 preFlush postFlush preFlush Update Operation postFlush preFlush postFlush First Name: Zara Last Name: Ali Salary: 5000 First Name: John Last Name: Paul Salary: 10000 preFlush postFlush If you check your EMPLOYEE table, it should have following records: mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 29 | Zara | Ali | 5000 | | 31 | John | Paul | 10000 | +----+------------+-----------+--------+ 2 rows in set (0.00 sec mysql>