Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 46

Contents

• The Problem
• Object-Relational Mapping
• Hibernate Core Concepts
• Hibernate Architecture
• Hibernate Mappings
• Configuring Hibernate
• Working with Persistent Objects
• Persistence Lifecycle

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Contents

• Working with Collections


• More on Association Mappings
• HQL – The Hibernate Query Language
• Query by Criteria
• Query by Example
• Caching
• Other Hibernate Features
• Conclusions

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Two Different Worlds

Object-Oriented Systems Relational Databases


• Represent a problem • Efficient data
in terms of objects storage, retrieval
• Semantically richer, and integrity of the
encapsulate data data
and behavior • Provide a
“normalized” set of
data

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Natural Divergence

• Early on in a system’s life, both models


tend to look alike
• As the system matures two models
diverge
• They grow to do what they do best
– Object model gets richer
– Data model changes to
accommodate operational factors

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Object-Relational Mismatch

• Granularity
– Object Oriented vs. Database Types
– User-Defined Column Types (UDT) are
not portable
• Inheritance & Polymorphism
– Not supported in the relational
model
– No polymorphic queries
– Columns are strictly typed

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Object-Relational Mismatch

• Identity Mismatch
– Object Identity vs. Object Equality
– Different objects can map to the
same column or columns
– Database Identity Strategies
– Natural Keys versus Surrogate Keys

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Object-Relational Mismatch

• Associations
– Object References versus Foreign
Keys
– Directionality of Associations
– Tables associations are always one-
to-many or many-to-one
– Object associations can be many-to-
many

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Problem
Object-Relational Mismatch

• Object Graph Navigation


– Object-oriented applications “walk”
the object graph
– Object-oriented systems access what
they need
– With database we need a “plan” of
what to retrieve
– N+1 Problem is a common symptom

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Object-Relational Mapping

• Tools/techniques to store and retrieve


objects from a database
• From the code perspective it behaves like a
virtual object database
• A complete ORM solution should provide:
– Basic CRUD functionality
– An Object-Oriented Query Facility
– Mapping Metadata support
– Transactional Capability

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate
Relational Persistence For Idiomatic Java

• Provides
– Transparent persistence
– Object-querying capabilities
– Caching
• Works with fine-grained POJO-based models
• Supports most Databases
• Created by Gavin King, now part of the
JBoss Group

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate
Relational Persistence For Idiomatic
Java
• Declarative programming
• Uses Runtime Reflection
• Query Language is SQL-like
– Leverages programmer’s
knowledge
• Mappings
– Typically defined as XML
documents
• But you never have to write XML
if you don’t want to (XDoclet,
Copyrights 2008, BrickRed Technologies Pvt. Ltd.
Hibernate
Relational Persistence For Idiomatic
Java

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate
Core Concepts

• Session Factory
– is a cache of compiled mappings for a
single database.
– used to retrieve Hibernate Sessions
• Session
– Short lived
• Temporary bridge between the app and the
data storage
– Provides CRUD operations on Objects
– Wraps a JDBC Connection / J2EE Data
Source
– Serves as a first level object cache

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Architecture

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Architecture
Choices

• How much you use depends on your needs


– Lightweight
•Basic persistence
– Fully Integrated
•Transactions
•Caching
•Connection Pooling

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


O/R Mappings

• Hibernate Mapping (.hbm.xml) Files


define:
– Column to Field Mappings
– Primary Key mapping &
generation Scheme
– Associations
– Collections
– Caching Settings
– Custom SQL
– And many more settings…

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


HBM XML File
<hibernate-mapping
package="com.integrallis.techconf.domain">
<class name="Address">
<id name="Id" column="PK_ID" type="integer">
<generator class="identity" />
</id>
<property name="StreetAddress“ />

<property name="AptNumber" />
</class>
</hibernate-mapping>

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


O/R Mappings

• Hibernate uses smart defaults


• Mapping files can be generated:
– Manually
• Tedious, boring and error prone
• Total control of the mapping
– From POJOs
• XDoclet, Annotations
– From Database Schema
• Middlegen, Synchronizer, Hibernate
Tools

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Configuring Hibernate

• Hibernate Session Factory


configured via hibernate.cfg.xml
• CFG file determines which mappings
to load (.hbm.xml files)
• In your application SessionFactory is
a singleton
• You request a Session as needed to
work with persistent objects

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


The Big Picture

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Persistent Objects
Saving an Object
Address address = new
• POJO is created
Address();
• Start a Session
...
• Transaction is started
Session session = null;
• The object is saved
Transaction tx = null;
• The transaction is
try { committed
session = • The session is closed
factory.openSession();
tx =
session.beginTransaction();
session.save(address);
tx.commit();

} finally {
session.close();
} Copyrights 2008, BrickRed Technologies Pvt. Ltd.
Working with Persistent Objects
Loading an Object

Address address = null; • Start a Session


Session session = null; • POJO is loaded
session = • PK and Object Class
factory.openSession(); are provided
try { • The session is closed
address = (Address)
session.get(Address.class,
id);
} finally {
session.close();
}

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Persistent Objects
Deleting an Object

Session session = null; • Start a Session


Transaction tx = null; • Transaction is started
try { • The object is deleted
session = • The transaction is
factory.openSession(); committed
tx = • The session is closed
session.beginTransaction();
session.delete(address);
tx.commit();

} finally {
session.close();
}

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Persistence Lifecycle
Possible States

• Transient
– Not Associated with a database
table
– Non-transactional
• Persisted
– Object with Database Identity
– Associates object with a Session
– Transactional
• Detached
– no longer guaranteed to be in
synch with the database

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Persistence Lifecycle

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Collections

• Can represent a parent-child/one-many


relationship using most of the available Java
Collections
• Persistence by reach-ability
• No added semantics to your collections
• Available Collection mappings are
– <set>, <list>, <map>, <bag>, <array> and <primitive-
array>
• In the database mappings are defined by a
foreign key to the owning/parent entity

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Collections
A simple example

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Collections
A simple example

public class Conference implements Serializable {


...
// Tracks belonging to this Conference
private Set tracks;
public Set getTracks () { return tracks; }
public void setTracks (Set tracks) { this.tracks = tracks; }

// maintain bi-directional association


public void addTrack(Track track) {
if (null == tracks) tracks = new HashSet();
track.setConference(this);
tracks.add(track);
}

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Working with Collections
A simple example

<hibernate-mapping
package="com.integrallis.tcms.domai •Class/Table
n"> •How to generate PK
<class name="Conference"> •Other field mappings
<id column="PK_ID" name="Id“ •Java Set for the
type="integer"> Tracks
<generator class="identity" /> •Class on the many
</id> side
... •Foreign Key on the
<set name="Tracks" inverse="true" many side
cascade="all" lazy="false">
<one-to-many class="Track" />
<key
column="FK_CONFERENCE_ID" />

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Association Mappings
Supported Associations

• One-to-one
– Maintained with Foreign Keys in
Database
• One-to-many / Many-to-one
– Object on the ‘one’ side
– Collection on the many ‘side’
• Many-to-Many
– Use a ‘mapping’ table in the database

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Association Mappings
Some Details

• Inverse attribute used for bi-


directional associations
• Lazy Loading
– Configured per relationship
– Uses dynamic proxies at Runtime
• Cascading Styles
– “none” no operations are cascaded
– “all” all operations are cascaded
– Every operation in Hibernate has a
corresponding cascade style

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate Query Language
HQL

• An objectified version of SQL


– Polymorphic Queries
– Object parameters in Queries
– Less verbose than SQL
• Doesn’t hide the power of SQL
– SQL joins, Cartesian products
– Projections
– Aggregation (max, avg) and grouping
– Ordering
– Sub-queries
– …and more

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate Query Language
HQL

• Simplest HQL Query


– Return all Addresses

session = sessionFactory.openSession();
// query string – ‘Address’ refers to a Class not a Table
String queryString = "from Address";

// create, configure and execute the query


List addresses = session.createQuery(queryString).list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate Query Language
HQL

• A more elaborate HQL Query


– Return all Tracks in a Conference

Conference conference = …
session = sessionFactory.openSession();
// build a query string
String queryString = “from Tracks as t where t.Conference =
:conf”;
// create, configure and execute the query
List addresses = session.createQuery(queryString)
.setObject(“conf”, conference)
.list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate Query Language
HQL Parameters

• Named parameters removed positional problems


• May occur multiple times in the same query
• Self-documenting

List tracks = new ArrayList();


tracks.add(“JSE");
tracks.add(“JEE");
Query q = session
.createQuery("from Sessions s where s.Track in (:trackList)");
q.setParameterList(“trackList", tracks);
List sessions = q.list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Hibernate Query Language
HQL Parameters
• Specify bounds upon your result set
• The maximum number of rows
• The first row you want to retrieve

Query query = session.createQuery("from Users");


query.setFirstResult(50);
query.setMaxResults(100);
List someUsers = query.list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Query by Criteria
• Same query using the Criteria API
– Return all Tracks for a given Conference

Conference conference = …
session = sessionFactory.openSession();

// create and expression to match the given conference


Expression exp = Expression.eq(“Conference", conference);

List addresses = session


.createCriteria(Tracks.class)
.add(exp)
.list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Query by Example
• Return all Address for a given Street Name

Address address = new Address();


Address.setStreetAddress(“Main Street”);

// create example object


Example example = Example.create(address)
.ignoreCase()
.enableLike(MatchMode.ANYWHERE);

// create, configure and execute the query


List matches = session.createCriteria(Address.class)
.add(example)
.list();
Copyrights 2008, BrickRed Technologies Pvt. Ltd.
Caching in Hibernate

• 1st Level
– Transaction scoped cache provided by
the Session.
– Always available
• 2nd Level
– Process scoped cache
– Shared by all Sessions
– Optional
– Pluggable implementation, can be
clustered
• Query
– Use with care, profile first

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Caching in Hibernate

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Caching in Hibernate

• Caching setting in HBM for Read


Only

<class name=“ReferenceData”
table=“REFDATA”>
<cache usage=“read-only” />
..
</class>

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Caching in Hibernate

• Caching setting in HBM for


Read/Write
• Profile the application before
applying

<class name=“ReadMostly”
table=“READMOSTLY”>
<cache usage=“nonstrict-read-write” />
..
</class>

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Caching in Hibernate

• Query Caching, most difficult to get right


• Analyze/Profile First. Let usage determine
which queries to cache

String queryString = “from ...”;


List hits = session
.createQuery(queryString)
.setObject(“user”, user)
.setCacheable(true)
.list();

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Other Hibernate Features

• Multiple Strategies for supporting


Inheritance
• Scalar Query Results
• Projections
• Custom SQL for Loading, Updating
and Deleting
• J2EE/JTA Friendly
• Spring Integration

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Conclusions
Why should you use Hibernate?

• It’s a well designed product. Look at the


source!
• It covers 80% of your persistence needs and
does a fine job on the other 20%
• You get to work with POJOs, not coarse-
grained EJBs
• Performance is good! Boils down to the
generated SQL
– If you don’t like it, you can always use custom
SQL

Copyrights 2008, BrickRed Technologies Pvt. Ltd.


Conclusions
Why should you use Hibernate?

• Good separation of integration tier and the


rest of the application
• Avoid reinventing the well
• Good community support, large pool of
talent

Copyrights 2008, BrickRed Technologies Pvt. Ltd.

You might also like