Hibernate

Download as pdf or txt
Download as pdf or txt
You are on page 1of 43

Hibernate Overview

Hibernate is an Object-Relational Mapping (ORM) solution for JAVA. It is 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 relieves the developer from 95% of common data persistence
related programming tasks.

Hibernate sits between traditional Java objects and database server to handle all the
works 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 the database or in any table, then you need to change
the XML file properties only.


Abstracts away the unfamiliar SQL types and provides a way to work around
familiar Java Objects.

Hibernate does not require an application server to operate.

Manipulates Complex associations of objects of your database.

Minimizes database access with smart fetching strategies.

Provides simple querying of data.

Supported Databases
Hibernate supports almost all the major RDBMS. Following is a 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 −
 XDoclet Spring

 J2EE

 Eclipse plug-ins

 Maven

Hibernate Framework
Hibernate is a Java framework that simplifies the development of Java application to interact with
the database. It is an open source, lightweight, ORM (Object Relational Mapping) tool. Hibernate
implements the specifications of JPA (Java Persistence API) for data persistence.

ORM Tool
An ORM tool simplifies the data creation, data manipulation and data access. It is a programming
technique that maps the object to the data stored in the database.

The ORM tool internally uses the JDBC API to interact with the database.

What is JPA?
Java Persistence API (JPA) is a Java specification that provides certain functionality and standard
to ORM tools. The javax.persistence package contains the JPA classes and interfaces.

Advantages of Hibernate Framework


Following are the advantages of hibernate framework:

1) Open Source and Lightweight

Hibernate framework is open source under the LGPL license and lightweight.

2) Fast Performance
The performance of hibernate framework is fast because cache is internally used in hibernate
framework. There are two types of cache in hibernate framework first level cache and second level
cache. First level cache is enabled by default.

3) Database Independent Query

HQL (Hibernate Query Language) is the object-oriented version of SQL. It generates the database
independent queries. So you don't need to write database specific queries. Before Hibernate, if
database is changed for the project, we need to change the SQL query as well that leads to the
maintenance problem.

4) Automatic Table Creation

Hibernate framework provides the facility to create the tables of the database automatically. So
there is no need to create tables in the database manually.

5) Simplifies Complex Join

Fetching data from multiple tables is easy in hibernate framework.

6) Provides Query Statistics and Database Status

Hibernate supports Query cache and provide statistics about query and database status.

Hibernate Architecture
1. Hibernate Architecture
2. Elements of Hibernate Architecture
1. SessionFactory
2. Session
3. Transaction
4. ConnectionProvider
5. TransactionFactory

The Hibernate architecture includes many objects such as persistent object, session factory,
transaction factory, connection factory, session, transaction etc.

The Hibernate architecture is categorized in four layers.

o Java application layer


o Hibernate framework layer
o Backhand api layer
o Database layer
Let's see the diagram of hibernate architecture:

This is the high level architecture of Hibernate with mapping file and configuration file.
Hibernate framework uses many objects such as session factory, session, transaction etc.
alongwith existing Java API such as JDBC (Java Database Connectivity), JTA (Java Transaction API)
and JNDI (Java Naming Directory Interface).

Elements of Hibernate Architecture


For creating the first hibernate application, we must know the elements of Hibernate architecture. They are as follows:

SessionFactory

The SessionFactory is a factory of session and client of ConnectionProvider. It holds second level
cache (optional) of data. The org.hibernate.SessionFactory interface provides factory method to
get the object of Session.

Session

The session object provides an interface between the application and data stored in the database.
It is a short-lived object and wraps the JDBC connection. It is factory of Transaction, Query and
Criteria. It holds a first-level cache (mandatory) of data. The org.hibernate.Session interface
provides methods to insert, update and delete the object. It also provides factory methods for
Transaction, Query and Criteria.

Transaction
The transaction object specifies the atomic unit of work. It is optional. The
org.hibernate.Transaction interface provides methods for transaction management.

ConnectionProvider

It is a factory of JDBC connections. It abstracts the application from DriverManager or DataSource.


It is optional.

TransactionFactory

It is a factory of Transaction. It is optional.

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 the following advantages over plain JDBC −

Sr.No. Advantages

1 Let’s 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 −

Sr.No. 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

Hibernate Environment
Downloading Hibernate
It is assumed that you already have the latest version of Java installed on your
system. Following are the simple steps to download and install Hibernate on your
system −

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-


distribution3.6.4.Final and when you unzip the downloaded file, it will
give you directory structure as shown in the following image

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 will have
to copy library files from /lib into your CLASSPATH, and change your CLASSPATH
variable accordingly.

Sr.No. Packages/Libraries

1 dom4j

XML parsing www.dom4j.org/

2 Xalan
XSLT Processor https://xml.apache.org/xalan-j/

3 Xerces

The Xerces Java Parser https://xml.apache.org/xerces-j/

4 cglib

Appropriate changes to Java classes at runtime


http://cglib.sourceforge.net/

5 log4j

Logging Faremwork https://logging.apache.org/log4j

6 Commons

Logging, Email etc. https://jakarta.apache.org/commons

7 SLF4J

Logging Facade for Java https://www.slf4j.org

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 will be required to configure for a
databases in a standalone situation −
Sr.No. Properties & 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 −

Sr.No. Properties & Description

1 hibernate.connection.datasource

The JNDI name defined in the application server context, which 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 create hibernate.cfg.xml configuration file and place it in the root of your
application's classpath. You will have to make sure that you have testdb database
available in your MySQL database and you have a user testavailable to access the
database.

The XML configuration file must conform to the Hibernate 3 Configuration DTD,
which is available at 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>

The above configuration file includes <mapping> tags, which are related to
hibernatemapping file and we will see in next chapter what exactly a hibernate
mapping file is and how and why do we use it?

Following is the list of various important databases dialect property type −

Sr.No. Database & Dialect Property

1 DB2

org.hibernate.dialect.DB2Dialect

2 HSQLDB

org.hibernate.dialect.HSQLDialect

3 HypersonicSQL

org.hibernate.dialect.HSQLDialect

4 Informix

org.hibernate.dialect.InformixDialect
5 Ingres
org.hibernate.dialect.IngresDialect

6 Interbase

org.hibernate.dialect.InterbaseDialect

7 Microsoft SQL Server 2000

org.hibernate.dialect.SQLServerDialect

8 Microsoft SQL Server 2005

org.hibernate.dialect.SQLServer2005Dialect

9 Microsoft SQL Server 2008

org.hibernate.dialect.SQLServer2008Dialect

10 MySQL

org.hibernate.dialect.MySQLDialect

11 Oracle (any version)

org.hibernate.dialect.OracleDialect

12 Oracle 11g

org.hibernate.dialect.Oracle10gDialect

13 Oracle 10g

org.hibernate.dialect.Oracle10gDialect

14 Oracle 9i

org.hibernate.dialect.Oracle9iDialect

15 PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

16 Progress

org.hibernate.dialect.ProgressDialect

17 SAP DB
org.hibernate.dialect.SAPDBDialect

18 Sybase

org.hibernate.dialect.SybaseDialect

19 Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

Hibernate - Sessions

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. 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 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.

Session Interface Methods


There are number of methods provided by the Session interface, but I'm going to
list down a 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.

Sr.No. Session Methods & 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?

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.

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 setXXX methods 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.
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() {}

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;

}}

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, but a number of
tools exist to generate the mapping document. These include XDoclet, Middlegen
and AndroMDA for the 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;

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 understand a 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 tablename 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 generate the


primary key values automatically. 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.

Hibernate - Mapping Types

When you prepare a Hibernate mapping document, you find that you map the 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
builtin 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

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
VARBINARY (or
binary byte[]
BLOB)

text java.lang.String CLOB

any Java class that implements VARBINARY (or


serializable
java.io.Serializable 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

Hibernate - O/R Mappings

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 −

 Mapping of collections,

 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 of java.util.Map, java.util.Set,
java.util.SortedMap, java.util.SortedSet, java.util.List, and any array of
persistent entities or values.
Sr.No. Collection type & Mapping Description

1 java.util.Set
This is mapped with a <set> element and initialized with java.util.HashSet

2 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.

3 java.util.List
This is mapped with a <list> element and initialized with java.util.ArrayList

4 java.util.Collection
This is mapped with a <bag> or <ibag> element and initialized with
java.util.ArrayList

5 java.util.Map
This is mapped with a <map> element and initialized with java.util.HashMap

6 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 am 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.

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.

Sr.No. Mapping type & Description

1 Many-to-One
Mapping many-to-one relationship using Hibernate

2 One-to-One
Mapping one-to-one relationship using Hibernate
3 One-to-Many
Mapping one-to-many relationship using Hibernate

4 Many-to-Many
Mapping many-to-many relationship using Hibernate

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 its 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.

Sr.No. Mapping type & Description

1 Component Mappings
Mapping for a class having a reference to another class as a member variable.

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 are the
newest way to define mappings without the 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 the 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));

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 of 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.persistencepackage,
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.

@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 that I'm not going to discuss here, so let us use only 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();

/* 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 = (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.

<?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></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 the following result, and records would be created in EMPLOYEE
table.

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,
especially when you have the 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 −

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 then 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();

Using Named Parameters


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 delete 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 −

Sr.No. 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.

Sr.No. 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();

You might also like