ObjectRelational Mapping with Hibernate - PowerPoint PPT Presentation

1 / 54
About This Presentation
Title:

ObjectRelational Mapping with Hibernate

Description:

Represent a problem in terms of objects. Semantically richer, ... Tedious, boring and error prone. Total control of the mapping. From POJOs. XDoclet, Annotations ... – PowerPoint PPT presentation

Number of Views:258
Avg rating:3.0/5.0
Slides: 55
Provided by: ORA25
Category:

less

Transcript and Presenter's Notes

Title: ObjectRelational Mapping with Hibernate


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 ProblemTwo 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
The ProblemNatural Divergence
  • Early on in a systems 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

6
The ProblemObject-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
  • N1 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
HibernateRelational 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 programmers knowledge
  • Mappings
  • Typically defined as XML documents
  • But you never have to write XML if you dont want
    to (XDoclet, JSE 1.5 Annots)

13
Hibernate Relational Persistence For Idiomatic
Java
14
HibernateCore 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
ArchitectureChoices
  • 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
  • lthibernate-mapping
  • package"com.integrallis.techconf.domain"gt
  • ltclass name"Address"gt
  • ltid name"Id" column"PK_ID"
    type"integer"gt
  • ltgenerator class"identity" /gt
  • lt/idgt
  • ltproperty name"StreetAddress /gt
  • ltproperty name"AptNumber" /gt
  • lt/classgt
  • lt/hibernate-mappinggt

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 ObjectsSaving 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 ObjectsLoading 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 ObjectsDeleting 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 LifecyclePossible 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
  • ltsetgt, ltlistgt, ltmapgt, ltbaggt, ltarraygt and
    ltprimitive-arraygt
  • In the database mappings are defined by a foreign
    key to the owning/parent entity

28
Working with CollectionsA simple example
29
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)

30
Working with Collections A simple example
  • lthibernate-mapping package"com.integrallis.tcms.d
    omain"gt
  • ltclass name"Conference"gt
  • ltid column"PK_ID" name"Id
  • type"integer"gt
  • ltgenerator class"identity" /gt
  • lt/idgt
  • ...
  • ltset name"Tracks" inverse"true"
  • cascade"all" lazy"false"gt
  • ltone-to-many class"Track" /gt
  • ltkey column"FK_CONFERENCE_ID" /gt
  • 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 MappingsSupported 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 MappingsSome 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 LanguageHQL
  • An objectified version of SQL
  • Polymorphic Queries
  • Object parameters in Queries
  • Less verbose than SQL
  • Doesnt hide the power of SQL
  • SQL joins, Cartesian products
  • Projections
  • Aggregation (max, avg) and grouping
  • Ordering
  • Sub-queries
  • and more

34
Hibernate Query LanguageHQL
  • 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 LanguageHQL
  • 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 LanguageHQL 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 LanguageHQL 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.clas
    s)

  • .add(example)
  • .list()

40
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

41
Caching in Hibernate
42
Caching in Hibernate
  • Caching setting in HBM for Read Only
  • ltclass nameReferenceData
  • tableREFDATAgt
  • ltcache usageread-only /gt
  • ..
  • lt/classgt

43
Caching in Hibernate
  • Caching setting in HBM for Read/Write
  • Profile the application before applying
  • ltclass nameReadMostly
  • tableREADMOSTLYgt
  • ltcache usagenonstrict-read-write /gt
  • ..
  • lt/classgt

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
ConclusionsWhy should you use Hibernate?
  • Its 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 dont like it, you can always use custom
    SQL

47
ConclusionsWhy 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
Lets Look at some CodeQuick 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_at_integrallis.com Our website http//www.i
ntegrallis.com Updated Slides Online
51
  • Shameless Plug -)

get the book
52
  • Shameless Plug -)

so that I can feed him
53
(No Transcript)
54
(No Transcript)
Write a Comment
User Comments (0)
About PowerShow.com