2. 1.
2.
3.
4.
5.
6.
7.
Hibernate Introduction
Why to use Hibernate
Steps to use/configure hibernate in an application
simple case study
Transaction in Hibernate
Using Criteria in Hibernate
Caching in Hibernate
3. Hibernate Introduction:
Hibernate is a powerful, high performance object/relational persistence and
query service. Hibernate lets you develop persistent classes following objectoriented idiom - including association, inheritance, polymorphism, composition,
and collections. Hibernate allows you to express queries in its own portable
SQL extension (HQL), as well as in native SQL, or with an object-oriented
Criteria and Example API.
Object/Relational Mapping Hibernate Dual-Layer Cache Architecture
Highly scalable architecture
J2EE integration
Object Relational tool ( JDO, Hibernate, and iBatis SQL Maps, TopLink)
Hibernate supports these following databases:
4. Why to use Hibernate
In traditional approach:
o Too many SQL statements
o Manually handled associations
o Database dependent
6. Steps to use/configure hibernate in an application:
A. Installing the Hibernate core and support JAR libraries into your project
B.
Creating a Hibernate.cfg.xml file to describe how to access your database
C.
Selecting appropriate SQL Dialect for the database.
D.
Creating individual mapping descriptor files for each persistable Java
classes
7. Steps to use Hibernate
A. Install the Hibernate core and JAR libraries
8. Steps to use Hibernate
B. Creating a Hibernate.cfg.xml :
Before Hibernate can retrieve and persist objects for us, we need to tell it the
settings about our application. For example,
which kind of objects are persistent objects?
Which kind of database are we using?
How to connect to the database?
What is the size of Connection pool?
There are three ways to configure Hibernate in total:
1. XML configuration
2. programmatic configuration
3. properties file configuration.
10. Steps to use Hibernate
C.
Selecting appropriate SQL Dialect for the
database.
The dialect property determines the dialect to be used when generating
queries. Hibernate supports dialects for all popular Relational Database
Management Systems (RDBMS), such as DB2 or Oracle™. Therefore, for
example, if you use Oracle during development and want to move to DB2 in
production, changes will only be required in the hibernate.cfg.xml file.
11. Steps to use Hibernate
A. Creating individual mapping/descriptor files for
each persistable Java classes/Table in DB
Table
JAVA
POJO Class
XML
HBM File
RDBMS
A
12. 12. Steps to use Hibernate
A Table in Database
CREATE TABLE BOOK (
ISBN VARCHAR(50) NOT NULL,
NAME VARCHAR(100) NOT NULL,
PRICE INT NOT NULL,
PRIMARY KEY (ISBN)
);
16. simple case study
Creating global session factory:
For an application using Hibernate as O/R mapping framework, a global
session factory should be created and accessed through a particular interface.
Here we use a static variable for storing the session factory. It is initialized in a
static block when this class is loaded for the first time.
17. Simple Case Study
Using the SessionFactory in Application:
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.openSession();
try {
} finally {
//…………………..
// Using the session to retrieve objects
//……………………………….
session.close();
}
SessionFactorys are immutable. The behaviour of a SessionFactory is
controlled by properties supplied at configuration time.
18. Simple Case Study
Retrieving objects
Book book = (Book)
session.load(Book.class, isbn);
or
Book book = (Book) session.get(Book.class,
isbn);
What’s the difference between load() and get() ?
The first difference is that when the given ID could not be found, load() will
throw an exception “org.hibernate.ObjectNotFoundException”, while get() will
return a null object.
The second difference is that load() just returns a proxy by default and
database won’t be hit until the proxy is first invoked. The get() will hit the
database immediately.
19. 19. Simple Case Study
Using HQL (Hibernate Query Language):
If you are sure that there will be only one object matching, you can use the
uniqueResult() method to retrieve the unique result object.
So, the code would appear as:
20. 20. Simple Case Study
persisting Objects:
For saving a newly created object, we can use the save() method. Hibernate
will issue an INSERT statement.
session.save(book);
For updating an existing object, we can use the update() method. Hibernate will
issue an UPDATE statement.
session.update(book);
For deleting an existing object, we can use the delete() method. Hibernate will
issue a DELETE statement.
session.delete(book);
22. Simple Case Study
ID generation in Hibernate
There are three approaches to set ID:
a. Sequence
b. Identity
c.
Native
23. 23. Simple Case Study
ID generation in Hibernate
There are three approaches to set ID:
a.Sequence
To generate an ID is to use an auto-incremented sequence number. For some
kinds of databases (including HSQLDB), we can use a sequence/generator to
generate this sequence number:
24. Simple Case Study
b. Identity:
To generate an auto-incremented sequence
number is to use an identity column of a table.
25. 25. Simple Case Study
c. Native:
most suitable strategy to use for your database
26. 26. Simple Case Study
primary key generation using multiple columns:
Table:
35. 35. Transaction in Hibernate
Sometimes we need to build up a query dynamically in our application,
e.g. for an advanced search function.“Criteria Queries” is an alternative
way of HQL query.The traditional method of doing this is to generate a HQL
statement, or SQL statement if not using Hibernate, by string
concatenation. The problem for this method is making your code hard to
maintain because of the hard reading statement fragments.
Traditinal approach:
if (startDate != null) {
if (firstClause) {
query = query + " where ";
} else {
query = query + " and ";
query += " s.date >= '" + startDate + "'";
}
// And so on...
36. Transaction in Hibernate
Hibernate Criteria:
Criteria criteria = session.createCriteria(Book.class);
if (startDate != null) {
criteria.add(Expression.ge("date",startDate);
}
if (endDate != null) {
criteria.add(Expression.le("date",endDate);
}
List results = criteria.list();
37. 37. Transaction in Hibernate
SELECT * FROM ORDERS WHERE ORDER_ID=’1092’;
In Cretira it would become:
List orders= session.createCriteria(Order.class)
.add(Restrictions.eq(“orderId”,”1092”))
.list();
SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE
O.ORDER_ID=P.ORDER_ID AND P.ID=’1111’;
Would become
List orders = session.createCriteria(Order.class)
.setFetchMode(“products”,FetchMode.JOIN)
.add(Restrictions.eq(“id”,”1111”))
.list();
38. 38. Transaction in Hibernate
This criteria query corresponds to the following HQL query:
from Book book
where book.name = 'Hibernate for Beginners'
39. 39. Transaction in Hibernate
•Restriction.between is used to apply a "between" constraint to the field.
•Restriction.eq is used to apply an "equal" constraint to the field.
•Restriction.ge is used to apply a "greater than or equal" constraint to the field.
•Restriction.gt is used to apply a "greater than" constraint to the field.
•Restriction.idEq is used to apply an "equal" constraint to the identifier
property.
•Restriction.in is used to apply an "in" constraint to the field.
•Restriction.isNotNull is used to apply an "is not null" constraint to the field.
•Restriction.isNull is used to apply an "is null" constraint to the field.
•Restriction.ne is used to apply a "not equal" constraint to the field.
IN:
criteria.add(Restrictions.in("newCourseID", courseIDs));
41. 41. Caching in Hibernate
Hibernate supports the caching of persistent
objects at different levels:
1 st level of caching
2 nd Level of caching
42. 42. Caching in Hibernate
1. 1st level of caching:
Suppose we get an object with same identifier
for two times within a session, will Hibernate
query the database for two times?
43. 43. Caching in Hibernate
If we inspect the SQL statements executed by
Hibernate, we will find that only one database
query is made. That means Hibernate is caching
our objects in the same session. This kind of
caching is called “first level caching”, whose
caching scope is a session.
But how about getting an object with same
identifier for two times in two different sessions?
45. 45. Caching in Hibernate
We will find that two database queries are made.
That means Hibernate is not caching the
persistent objects across different sessions by
default.
We need to turn on this “second level caching”
whose caching scope is a session factory.
46. 46 Caching in Hibernate
To enable 2nd level of caching, update the ‘hibernate.cfg.xml’
To monitor the caching activities of Hibernate at runtime, we can add the
following line to the log4j configuration file “log4j.properties”.
log4j.logger.org.hibernate.cache=debug