Presentation is loading. Please wait.

Presentation is loading. Please wait.

Object-Relational Mapping with Hibernate Brian Sam-Bodden Principal Partner Integrallis Software, LLC. August 1 - 5, 2005.

Similar presentations


Presentation on theme: "Object-Relational Mapping with Hibernate Brian Sam-Bodden Principal Partner Integrallis Software, LLC. August 1 - 5, 2005."— Presentation transcript:

1 Object-Relational Mapping with Hibernate Brian Sam-Bodden Principal Partner Integrallis Software, LLC. August 1 - 5, 2005

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

3 Contents Working with Collections More on Association Mappings HQL – The Hibernate Query Language Query by Criteria Query by Example Caching Other Hibernate Features Conclusions

4 The Problem Two Different Worlds Object-Oriented Systems Represent a problem in terms of objects Semantically richer, encapsulate data and behavior Relational Databases Efficient data storage, retrieval and integrity of the data Provide a “normalized” set of data

5 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 The Problem Natural Divergence

6 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

7 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

8 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

9 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

10 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

11 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

12 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, JSE 1.5 Annots)

13 Hibernate Relational Persistence For Idiomatic Java

14 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

15 Architecture

16 Architecture Choices How much you use depends on your needs –Lightweight Basic persistence –Fully Integrated Transactions Caching Connection Pooling

17 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…

18 HBM XML File <hibernate-mapping package="com.integrallis.techconf.domain"> …

19 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

20 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

21 The Big Picture

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

23 Working with Persistent Objects Loading an Object Address address = null; Session session = null; session = factory.openSession(); try { address = (Address) session.get(Address.class, id); } finally { session.close(); } Start a Session POJO is loaded PK and Object Class are provided The session is closed

24 Working with Persistent Objects Deleting an Object Session session = null; Transaction tx = null; try { session = factory.openSession(); tx = session.beginTransaction(); session.delete( address ); tx.commit(); … } finally { session.close(); } Start a Session Transaction is started The object is deleted The transaction is committed The session is closed

25 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

26 Persistence Lifecycle

27 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 –,,,, and In the database mappings are defined by a foreign key to the owning/parent entity

28 Working with Collections A simple example

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

30 Working with Collections A simple example <id column=" PK_ID " name=" Id “ type="integer">... <set name=" Tracks " inverse="true" cascade="all" lazy="false"> Class/Table How to generate PK Other field mappings Java Set for the Tracks Class on the many side Foreign Key on the many side

31 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

32 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

33 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

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

35 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();

36 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();

37 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();

38 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();

39 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();

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

41 Caching in Hibernate

42 Caching setting in HBM for Read Only <class name=“ReferenceData” table=“REFDATA”>..

43 Caching in Hibernate Caching setting in HBM for Read/Write Profile the application before applying <class name=“ReadMostly” table=“READMOSTLY”>..

44 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();

45 Other Hibernate Features Multiple Strategies for supporting Inheritance Scalar Query Results Projections Custom SQL for Loading, Updating and Deleting J2EE/JTA Friendly Spring Integration

46 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

47 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

48 Let’s Look at some Code Quick Live Demos Some CRUD Demos Inheritance Demo –using Table-Per-Class-Hierarchy Hibernate Components Hibernate code in a J2EE app

49 Questions?

50 Thank you! You can contact me with questions at bsbodden@integrallis.com Our website http://www.integrallis.com Updated Slides Online

51 Shameless Plug ;-) get the book…

52 Shameless Plug ;-) …so that I can feed him

53

54


Download ppt "Object-Relational Mapping with Hibernate Brian Sam-Bodden Principal Partner Integrallis Software, LLC. August 1 - 5, 2005."

Similar presentations


Ads by Google