Presentation is loading. Please wait.

Presentation is loading. Please wait.

V 6, 2006-09-28 Mats Strandberg ORM With Hibernate.

Similar presentations


Presentation on theme: "V 6, 2006-09-28 Mats Strandberg ORM With Hibernate."— Presentation transcript:

1 v 6, 2006-09-28 Mats Strandberg ORM With Hibernate

2 v 6, 2006-09-28 Mats Strandberg 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

3 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

4 v 6, 2006-09-28 Mats Strandberg Simple Domain Model Event Participant Venue Address 0..n 1 1

5 v 6, 2006-09-28 Mats Strandberg Simple Domain Model Event Participant Venue Address 0..n 1 1 name street city name 0..n date

6 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

7 v 6, 2006-09-28 Mats Strandberg Example Code and Mapping File

8 v 6, 2006-09-28 Mats Strandberg Relational Schema Events Participants Venues Addresses * VenueId * AddressId street * ParticipantId * EventId name EventParticipations * ParticipantId * EventIdname date EventVenue name VenueAddress city

9 v 6, 2006-09-28 Mats Strandberg Example execution

10 v 6, 2006-09-28 Mats Strandberg On Root Objects In an object graph usually theres roots, where navigation starts. Root

11 v 6, 2006-09-28 Mats Strandberg Navigation event.getVenue().getAddress().getStreet(); Event Participant Venue Address name street city name date SELECT street FROM Addresses WHERE AddressId= (SELECT VenueAddress FROM Venues WHERE VenueId= (SELECT EventVenue FROM Events WHERE EventId=1));

12 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 city name date Get streets in Stockholm SELECT street FROM Addresses WHERE city="Stockholm";

13 v 6, 2006-09-28 Mats Strandberg Object Queries Roots may not be enough for search We need at least class extension or OQL

14 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 city name date Get street in Stockholm SELECT street FROM Addresses WHERE city="Stockholm";

15 v 6, 2006-09-28 Mats Strandberg Example: Hibernate + Domain model Take a look at: Java SQL

16 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

17 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

18 v 6, 2006-09-28 Mats Strandberg Reasons For ORM vs OODB Legacy RDB (Relational Database) (RDB) vendor independence Vendor stability(?) Schema migration Tools

19 v 6, 2006-09-28 Mats Strandberg Alternatives to ORM Hand coded persistance layer Serialization EJB/CMP OODB

20 v 6, 2006-09-28 Mats Strandberg Hibernate Open Source LGPL Licence http://hibernate.org

21 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

22 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

23 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

24 v 6, 2006-09-28 Mats Strandberg Impedance Mismatch Identity Granularity Object navigation Subtypes Polymorphic associations

25 v 6, 2006-09-28 Mats Strandberg Inheritance Table per concrete class A a1 B b1 C c1 B a1 C * id a1 * id A a1 b1 c1 A * id B C a1 b1c1 Table per class hierarchy Table per class

26 v 6, 2006-09-28 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!

27 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

28 v 6, 2006-09-28 Mats Strandberg Lazy vs Eager fetch EventVenueAddress namestreet city name date Venue$ name isA

29 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()); }

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

31 v 6, 2006-09-28 Mats Strandberg Caching First-level Cache Session Second-level Cache Query CacheCache Concurrency Strategy Cache Provider

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

33 v 6, 2006-09-28 Mats Strandberg Hibernate Product Suite Hibernate Core Hibernate Annotations Hibernate EntityManager Hibernate Tools NHibernate JBoss Seam

34 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)

35 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

36 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

37 v 6, 2006-09-28 Mats Strandberg Books on Hibernate Etc.

38 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


Download ppt "V 6, 2006-09-28 Mats Strandberg ORM With Hibernate."

Similar presentations


Ads by Google