You are on page 1of 38

ORM With Hibernate

Mats Strandberg

v 6, 2006-09-28

Presentation
Impedance mismatch What is ORM When/why use ORM Understand Hibernate basics See Java using Hibernate API See SQL Understand Hibernate features Ask questions

v 6, 2006-09-28

Mats Strandberg

Crisp Utbildningsdag (Crisp RD)


Crisp RD Every second Friday, usually by employee Some presentations at KTH Mats Strandberg Worked with several OODBs since 1990 Used RDBs in several OO projects Used Hibernate in one commercial project Worked with Java since 1996
v 6, 2006-09-28

Mats Strandberg

Simple Domain Model

Event
0..n

0..n

Venue
0..n

0..n

Participant

Address

v 6, 2006-09-28

Mats Strandberg

Simple Domain Model


Event
name date 0..n 0..n 0..n 1

Venue
name 0..n 1

Address
street city

Participant
name

v 6, 2006-09-28

Mats Strandberg

Object Diagram
hibernateRd: Event
name=Hibernate RD date=20060929 9.00

theVenue : Venue
name=rum 1537

theAddress : Address mats : Participant


name=Mats Strandberg street=Osquars Backe 2 city=Stockholm

v 6, 2006-09-28

Mats Strandberg

Example Code and Mapping File

v 6, 2006-09-28

Mats Strandberg

Relational Schema
Participants
* ParticipantId name

EventParticipations
* ParticipantId * EventId

Events
* EventId name

Addresses
* AddressId street city

Venues
* VenueId name VenueAddress

date EventVenue

v 6, 2006-09-28

Mats Strandberg

Example execution

v 6, 2006-09-28

Mats Strandberg

On Root Objects
In an object graph usually there s roots, where navigation starts.
Root

v 6, 2006-09-28

Mats Strandberg

Navigation
Event
name date

Venue
name

Address Participant
name street city

event.getVenue().getAddress().getStreet();
SELECT street FROM Addresses WHERE AddressId= (SELECT VenueAddress FROM Venues WHERE VenueId= (SELECT EventVenue FROM Events WHERE EventId=1));
v 6, 2006-09-28

Mats Strandberg

Event
name

Venue
name

Query
Get streets in Stockholm

date

Address Participant
name street city

SELECT street FROM Addresses WHERE city="Stockholm";


List list = // get events for (Iterator iter = list.iterator(); iter.hasNext(); ) { Event event = (Event) iter.next(); Address address = event.getVenue().getAddress(); if ("Stockholm".equals(address.getCity())) { System.out.println("'" + address.getStreet() + "' is in Stockholm"); } }
v 6, 2006-09-28

Mats Strandberg

Object Queries
Roots may not be enough for search We need at least class extension or OQL

v 6, 2006-09-28

Mats Strandberg

Event
name

Venue
name

HQL
Get street in Stockholm

date

Address Participant
name street city

SELECT street FROM Addresses WHERE city="Stockholm";


List list = session.createQuery( "select street from Address where city='Stockholm'").list(); for (Iterator iter = list.iterator(); iter.hasNext(); ) { System.out.println("'" + iter.next() + "' is in Stockholm"); }

v 6, 2006-09-28

Mats Strandberg

Example: Hibernate + Domain model


Take a look at: Java SQL

v 6, 2006-09-28

Mats Strandberg

Why a Database?
Need for persitent state Support for transactions Large data sets Multiple concurrent applications share data Data distribution Usually disk based (persistence with single node) Only add complexity to solve a real problem

v 6, 2006-09-28

Mats Strandberg

Reasons for Object Persistence vs RDB


Reasons to use OODB or ORM: Use of OO in design and programming (avoid impedance mismatch) Domain Model Intense solution Hierarchic data Navigational access

v 6, 2006-09-28

Mats Strandberg

Reasons For ORM vs OODB


Legacy RDB (Relational Database) (RDB) vendor independence Vendor stability(?) Schema migration Tools

v 6, 2006-09-28

Mats Strandberg

Alternatives to ORM
Hand coded persistance layer Serialization EJB/CMP OODB

v 6, 2006-09-28

Mats Strandberg

Hibernate
Open Source LGPL Licence http://hibernate.org

v 6, 2006-09-28

Mats Strandberg

Hibernate is non-intrusive
This means: Persistence is orthogonal to class Persisting a instance is a run-time decision

v 6, 2006-09-28

Mats Strandberg

Requirements for a Persistent Class


Hibernate is said to non-intrusive , however: Classes must have a no-arg constructor Classes should have a private Long id; Classes may have private database attributes

v 6, 2006-09-28

Mats Strandberg

Understand ORM to use it


The effective use of ORM technology in all but the simplest of enterprise environments requires understanding and configuring how the mediation between relational data and objects is performed Linda DeMichiel, Lead Architect EJB, Sun

v 6, 2006-09-28

Mats Strandberg

Impedance Mismatch
Identity Granularity Object navigation Subtypes Polymorphic associations

v 6, 2006-09-28

Mats Strandberg

Inheritance

A
a1

B
* id a1 b1

C
* id a1 c1

B
b1

C
c1

A
* id a1 b1 c1

Table per concrete class


A
* id a1

Table per class hierarchy

B
* id b1

C
* id c1

v 6, 2006-09-28

Table per class

Mats Strandberg

Application Transactions
A.k.a. long running transactions An object graph can be detached Updates can be done while detached The object graph can later be attached to a session session.close() detaches the objects session.update(object) attaches the object NOTE: Other updates may be clobbered!
v 6, 2006-09-28

Mats Strandberg

Detached objects + automatic versioning


Handle concurrent updates by versioning A version attribute must be added to classes involved Detach object by session.close() Updates can be done while detached Attach with session.update(object) Exception thrown by Hibernate at flush (commit) if version mismatch

v 6, 2006-09-28

Mats Strandberg

Lazy vs Eager fetch


Event
name date

Venue
name

Address
street city

isA Venue$
name

v 6, 2006-09-28

Mats Strandberg

Consider Performance
Iterating over a Class (Event) that has a n to m association
List list = session.createQuery("from Event").list(); for (Iterator i = list.iterator(); i.hasNext(); ) { Event event = (Event) i.next(); out.println("EVENT name:" + event.getName()); }

v 6, 2006-09-28

Mats Strandberg

Lazy initialization
A Proxy is used Getters are overridden, e.g. Event.getName(); The Proxy is a subclass of your persistent class, e.g extends Event Requires build-time bytecode instrumentation Beware of explicit comparison of runtime class, passing of class objects etc.

v 6, 2006-09-28

Mats Strandberg

Caching
First-level Cache Session

Cache Concurrency Strategy Cache Provider Second-level Cache

Query Cache

v 6, 2006-09-28

Mats Strandberg

Testing without database?


Testing business logic: Hibernate is non-intrusive -> Use POJOs in a transient way Think of transaction demarcation Beware of embedding HQL as it requires a DB.

v 6, 2006-09-28

Mats Strandberg

Hibernate Product Suite


Hibernate Core Hibernate Annotations Hibernate EntityManager Hibernate Tools NHibernate JBoss Seam

v 6, 2006-09-28

Mats Strandberg

Roadmap
Production: Hibernate 3.1 NHibernate 1.0 for :NET (Hibernate 2.1) Development: Hibernate 3.2 (EJB 3.0) NHibernate 1.2 (.NET Framework 2.0) NHibernate 3.x? (Hibernate 3)

v 6, 2006-09-28

Mats Strandberg

Entity Manager
Entity Manager implements a complete EJB3 persistence provider (together with Hibernate Annotations) EJB-QL based on HQL Automatic Versioning Detached Entities Non-managed set-up is rather different EJB3 has a large number of persistence contexts

v 6, 2006-09-28

Mats Strandberg

Features
Two Level Cache Locking strategies (e.g. Optimistic Locking) Application Transactions Composition Inheritance Polymorphism Persistence by reachability Fetching strategies: Lazy vs Eager Lazy initialization
v 6, 2006-09-28

Mats Strandberg

Books on Hibernate

Etc.
v 6, 2006-09-28

Mats Strandberg

Things to Mention
Locking JPA Java Persistence API Index Hibernate vs Manual ORM: When using Hibernate there is a standard for how the mapping has been done. This is good for maintenance Bidirectional relations are handled at code level

v 6, 2006-09-28

Mats Strandberg

You might also like