V 6, 2006-09-28 Mats Strandberg ORM With Hibernate.
-
Upload
rebecca-barker -
Category
Documents
-
view
228 -
download
0
Transcript of V 6, 2006-09-28 Mats Strandberg ORM With Hibernate.
v 6, 2006-09-28
Mats Strandberg
ORM With Hibernate
v 6, 2006-09-28
Mats Strandberg
Presentation
Impedance mismatchWhat is ORMWhen/why use ORMUnderstand Hibernate basicsSee Java using Hibernate APISee SQLUnderstand Hibernate featuresAsk questions
v 6, 2006-09-28
Mats Strandberg
Crisp Utbildningsdag (Crisp RD)
Crisp RDEvery second Friday, usually by employeeSome presentations at KTH
Mats StrandbergWorked with several OODBs since 1990Used RDBs in several OO projectsUsed Hibernate in one commercial projectWorked with Java since 1996
v 6, 2006-09-28
Mats Strandberg
Simple Domain Model
Event
Participant
Venue
Address
0..n
0..n
1
1
0..n
0..n
v 6, 2006-09-28
Mats Strandberg
Simple Domain Model
Event
Participant
Venue
Address
0..n
0..n
1
1
name
street
cityname
name
0..n
0..ndate
v 6, 2006-09-28
Mats Strandberg
Object Diagram
hibernateRd: Event
mats : Participant
theVenue : Venue
theAddress : Address
name=”rum 1537”
street=”Osquars Backe 2”
city=”Stockholm”name=”Mats Strandberg”
name=”Hibernate RD”
date=”20060929 9.00”
v 6, 2006-09-28
Mats Strandberg
Example Code and Mapping File
v 6, 2006-09-28
Mats Strandberg
Relational Schema
Events
Participants
VenuesAddresses
* VenueId* AddressId
street
* ParticipantId
* EventId
name
EventParticipations* ParticipantId
* EventIdname
date
EventVenuename
VenueAddresscity
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.getVenue().getAddress().getStreet();
Event
Participant
Venue
Address
name
street
cityname
name
date
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
Query
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");
}
}
Event
Participant
Venue
Address
name
street
cityname
name
date
Get streets in Stockholm
SELECT street FROM Addresses WHERE city="Stockholm";
v 6, 2006-09-28
Mats Strandberg
Object Queries
Roots may not be enough for searchWe need at least class extension orOQL
v 6, 2006-09-28
Mats Strandberg
HQL
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");
}
Event
Participant
Venue
Address
name
street
cityname
name
date
Get street in Stockholm
SELECT street FROM Addresses WHERE city="Stockholm";
v 6, 2006-09-28
Mats Strandberg
Example: Hibernate + Domain model
Take a look at: JavaSQL
v 6, 2006-09-28
Mats Strandberg
Why a Database?
Need for persitent stateSupport for transactionsLarge data setsMultiple concurrent applications share dataData distributionUsually 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 RDBReasons to use OODB or ORM:
Use of OO in design and programming(avoid impedance mismatch)Domain Model Intense solutionHierarchic dataNavigational access
v 6, 2006-09-28
Mats Strandberg
Reasons For ORM vs OODB
Legacy RDB (Relational Database)(RDB) vendor independenceVendor stability(?)Schema migrationTools
v 6, 2006-09-28
Mats Strandberg
Alternatives to ORM
Hand coded persistance layerSerializationEJB/CMPOODB
v 6, 2006-09-28
Mats Strandberg
Hibernate
Open SourceLGPL Licencehttp://hibernate.org
v 6, 2006-09-28
Mats Strandberg
Hibernate is ”non-intrusive”
This means:Persistence is orthogonal to classPersisting 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 constructorClasses 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 GranularityObject navigationSubtypesPolymorphic associations
v 6, 2006-09-28
Mats Strandberg
Inheritance
Table per concrete class
Aa1
Bb1
Cc1
B
a1
C* id
a1
* id
A* id
a1
b1
b1 c1
c1
A* id
B* id
C* id
a1
b1 c1
Table per class
hierarchy
Table per class
v 6, 2006-09-28
Mats Strandberg
Application Transactions
A.k.a. long running transactionsAn object graph can be detachedUpdates can be done while detachedThe object graph can later be attached to a session
session.close() detaches the objectssession.update(object) attaches the object
NOTE: Other updates may be clobbered!
v 6, 2006-09-28
Mats Strandberg
Detached objects + automatic versioningHandle concurrent updates by versioning
A version attribute must be added to classes involvedDetach object by session.close() Updates can be done while detachedAttach 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 Venue Address
name street
city
name
date
Venue$
name
isA
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 usedGetters are overridden, e.g. Event.getName();
The Proxy is a subclass of your persistent class, e.g extends EventRequires build-time bytecode instrumentationBeware of explicit comparison of runtime class, passing of class objects etc.
v 6, 2006-09-28
Mats Strandberg
CachingFirst-level Cache
Session
Second-level Cache
Query CacheCache Concurrency Strategy
Cache Provider
v 6, 2006-09-28
Mats Strandberg
Testing without database?
Testing business logic:Hibernate is non-intrusive -> Use POJOs in a transient wayThink of transaction demarcationBeware of embedding HQL as it requires a DB.
v 6, 2006-09-28
Mats Strandberg
Hibernate Product Suite
Hibernate CoreHibernate AnnotationsHibernate EntityManager Hibernate ToolsNHibernateJBoss Seam
v 6, 2006-09-28
Mats Strandberg
Roadmap
Production:Hibernate 3.1NHibernate 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 HQLAutomatic VersioningDetached EntitiesNon-managed set-up is rather differentEJB3 has a large number of persistence contexts
v 6, 2006-09-28
Mats Strandberg
Features
Two Level CacheLocking strategies (e.g. Optimistic Locking)Application TransactionsComposition InheritancePolymorphismPersistence by reachabilityFetching strategies: Lazy vs EagerLazy initialization
v 6, 2006-09-28
Mats Strandberg
Books on Hibernate
Etc.
v 6, 2006-09-28
Mats Strandberg
Things to Mention
LockingJPA – Java Persistence APIIndexHibernate vs Manual ORM: When using Hibernate there is a ”standard” for how the mapping has been done. This is good for maintenanceBidirectional relations are handled at code level