KEMBAR78
Not Just ORM: Powerful Hibernate ORM Features and Capabilities | PDF
Not Just ORM:
Powerful Hibernate ORM
Features and Capabilities
Brett Meyer
Senior Software Engineer
Hibernate ORM, Red Hat
Brett Meyer
• Hibernate ORM
– ORM 4 & 5 development
– Hibernate OSGi
– Developer community engagement
– Red Hat support, Hibernate engineering lead

• Other contributions
– Apache Camel
– Infinispan

• Contact me
– @brettemeyer or +brettmeyer
– Freenode #hibernate or #hibernate-dev (brmeyer)
github.com/brmeyer
/HibernateDemos

slideshare.net/brmeyer
ORM? JPA?
• ORM: Object/Relational Mapping
– Persistence: Data objects outlive the JVM app
– Maps Java POJOs to relational databases
– Supports OO concepts: inheritance, object identity, etc.
– Navigate data by walking the object graph, not the explicit
relational model

• JPA: Java Persistence API
• Hibernate ORM provides its own native API, in
addition to full JPA support
• Annotations and XML
Overview
•
•
•
•
•
•
•
•
•

Multi-Tenancy
Value Generation
Hibernate Spatial
Hibernate Envers
Hibernate OSGi
Hibernate Search
Hibernate OGM & Validator
Hibernate Shards
Ask questions after each section!
Multi-Tenancy
Multi-Tenancy
•
•
•
•

1 ORM instance
Multiple concurrent clients
Data specific to each tenant
Legacy
– Separate SessionFactories for each tenant
– Application-provided Connections (given when
opening a Session)
– Big schemas or many tenants = huge footprint
Hibernate ORM
Multi-Tenancy
•
•
•
•

Strategy selection is global
Tenant identifier provided when opening a Session
Works with 2LC: identifier used in cache data key
Custom impls:
– MultiTenantConnectionProvider: required for physical
and schema separated (required)
– CurrentTenantIdentifierResolver: required for opening a
Session without providing the tenant id (explicitly or
Session#getCurrentSession)
Hibernate ORM
Multi-Tenancy Strategies
• Physically separated databases
– 1 JDBC connection pool per tenant
– Pool selected based on tenant identifier

• Single database, separate schemas
– Option #1
• Similar to physically separated
• 1 JDBC connection pool per tenant
• Provides schema through the connection URL or pool

– Option #2:
• 1 JDBC connection pool using a default schema
• Each Connection altered with SQL “SET SCHEMA” prior to use
Hibernate ORM
Multi-Tenancy Strategies
• Single database and schema
– Data partitioned by discriminator value
– Discriminator complexity varies
– Each SQL statement altered to include the
discriminator
– Not yet implemented (planned for ORM 5)
– Alternative: @FilterDef/@Filter w/ a
tenantId as a param
Hibernate ORM
Multi-Tenancy
• DEMO
• Questions?
Value Generation
Value Generation (Legacy)
• Limited to in-database value generation
on insert/update
• Properties marked with @Generated
immediately selected
Hibernate ORM
Value Generation
•
•
•
•

New, expanded support in ORM 4.3
Supports legacy in-DB generation, but also in-mem
Create custom annotations!
ORM provides built in generators
– @Generated: legacy, providing in-database generation
– @CreationTimestamp: set only once when owning entity is saved for
the first time
– @UpdateTimestamp: set any time owning entity is saved
– @GeneratorType: provide custom in-memory generator and define
“when”

• DEMO
• Questions?
Hibernate Spatial
Hibernate Spatial
• Currently 3rd party, but pulling in as a new ORM module in 5
• Originally created by Karel Maesen (geovise.com)
• Java Topology Suite (JTS)
– OpenGIS Simple Feature Spec (SFS) & SQL/MM Spatial (extends SFS)
– Oracle, Postgres, MySQL, MS SQL, H2, etc. all implement the specs
– Attempts to provide abstract, cross-platform geo data, but diffs between
them

• geolatte-geom
– Developed/maintained by Karel
– Improvement over JTS
– Fully interoperable with JTS
– Support for lat/lon geographies
– Additional Dialect differences
Hibernate Spatial (cont'd)
• Properties use JTS Geometry types
– Point
– LineString
– Polygon
– etc.

• Adds HQL functions for Dialect-supported methods
– Same functions also implemented as Criteria API Criterions
– ex: "select e from Event e where within(e.location, :filter) =
true" (:filter is a Geometry)
– http://www.hibernatespatial.org/documentation/03-dialects/0
1-overview/
Hibernate Spatial (cont'd)
• Translates between “Well-known text” (WKT) and
Geometry types
– Spatial object markup language
– 2D and 3D
– ex: “POINT (30 10)”, “POLYGON ((30 10, 40 40, 20 40, 10 20,
30 10))”

• Coordinate system transformations possible in queries
• Does not require JDBC extension drivers (ex: Oracle
SDOAPI.jar or Postgres postgis.jar)
• DEMO
• Questions?
Hibernate Envers
Hibernate Envers
• Provides historical versioning and auditing (“SCM for data”)
• Each transaction == a “revision”
• Revision #s are global --> querying for a historical snapshot
of the entire database is possible
• Requires
– @Audited on the entity or individual properties
– [entity]_AUD tables to store the historical data (DDL created
automated if using hbm2ddl, otherwise it’s exportable)

• Duplicate data? Yes.
• Powerful queries/capabilities > cheap mem
• Highly configurable
Hibernate Envers (cont'd)
• Revision info
– Default: simple internal entity stored in REVINFO table
– Revision # and revision timestamp
– Override with custom @RevisionEntity & RevisionListener
(add other useful fields: IP address, “blame”, etc.)

• Revision entity types
– Track the entity types that were changed in each revision
– Disabled by default: requires querying tables for changed
data
– Can be overridden by implementing
EntityTrackingRevisionListener on your RevisionEntity
Hibernate Envers (cont'd)
• Revision properties
– Track the entity properties that were changed in each revision
– Disabled by default: requires querying tables for changed data
– Adds boolean columns to audit tables

• Queries
– Snapshot of entity states at a given revision (horizontal)
– Revisions at which entities changed (vertical)

• DEMO
• Questions?
• Conditional auditing
– Default: Envers auditing reacts to Hibernate ORM events
– Disable hibernate.listeners.envers.autoRegister, create your own listeners,
wire them in using Integrator
Hibernate OSGi
Hibernate OSGi
• OSGi?
• Provide only the OSGi manifest and hacky workarounds <-NO!
• Emphasize doing things “the OSGi way”
– Dynamic environment
– Scoping
• Limited visibility into the container
• No scanning all bundles
• Reduced conflicts, allows concurrent instances, etc.

– OSGi services

• Isolated in hibernate-osgi module (no pervasive
dependencies or OSGi code)
Hibernate OSGi (cont'd)
• 3 supported environments
– Enterprise OSGi Managed JPA
• Container discovers and manages persistence units and EntityManagerFactories
• Similar to many app servers, Spring, etc.
• Ex: Apache Aries JPA

– Un-managed JPA
• Direct use of hibernate-entitymanager
• EntityManagerFactories created through OSGi services

– Native
• Direct use of hibernate-core
• SessionFactories created through OSGi services

• Quickstarts
• Questions?
Hibernate Search
Hibernate Search
• Full-text search on the DB
– Bad performance
– CPU/IO overhead

• Offload full-text queries to Hibernate Search
engine
– Fully indexed
– Horizontally scalable

• Based on Apache Lucene
• “Google for your entities”
Hibernate Search (cont'd)
• Annotate entities with @Indexed
• Annotate properties with @Field
– Index the text: index=Index.YES
– “Analyze” the text: analyze=Analyze.YES
•
•
•
•
•

Lucene analyzer
Chunks sentences into words
Lowercase all of them
Exclude common words (“a”, “the”)
Stemming
Hibernate OGM &
Hibernate Validator
Hibernate OGM & Validator
• Hibernate OGM:
– ORM/JPA support for NoSQL
– Infinispan, EHCache, MongoDB, Neo4j

• Hibernate Validator
– Bean Validation impl, but extended
– Both annotation and XML based
– @NotNull, @Size(min = 2, max = 14),
@Min(2), etc.
Hibernate Shards
Hibernate Shards
• Started as a Google team's 20% project
• Horizontal partitioning across multiple databases
• Flexible sharding strategies, both provided and
custom
• Supports virtual shards: simplifies re-sharding
• Typical Hibernate ORM usage: HQL, Criteria, etc.
• Last supported ORM version: 3.6.x
• Currently has upgrade momentum – contact
me if interested!
How to Help:
hibernate.org
/orm/contribute
Hibernate ORM:
Tips, Tricks, and
Performance Techniques

Tomorrow, 1pm,
Ballroom D
QUESTIONS?
•
•
•
•

Q&A
#hibernate or #hibernate-dev (brmeyer)
@brettemeyer
+brettmeyer

Not Just ORM: Powerful Hibernate ORM Features and Capabilities

  • 2.
    Not Just ORM: PowerfulHibernate ORM Features and Capabilities Brett Meyer Senior Software Engineer Hibernate ORM, Red Hat
  • 3.
    Brett Meyer • HibernateORM – ORM 4 & 5 development – Hibernate OSGi – Developer community engagement – Red Hat support, Hibernate engineering lead • Other contributions – Apache Camel – Infinispan • Contact me – @brettemeyer or +brettmeyer – Freenode #hibernate or #hibernate-dev (brmeyer)
  • 4.
  • 5.
    ORM? JPA? • ORM:Object/Relational Mapping – Persistence: Data objects outlive the JVM app – Maps Java POJOs to relational databases – Supports OO concepts: inheritance, object identity, etc. – Navigate data by walking the object graph, not the explicit relational model • JPA: Java Persistence API • Hibernate ORM provides its own native API, in addition to full JPA support • Annotations and XML
  • 6.
    Overview • • • • • • • • • Multi-Tenancy Value Generation Hibernate Spatial HibernateEnvers Hibernate OSGi Hibernate Search Hibernate OGM & Validator Hibernate Shards Ask questions after each section!
  • 7.
  • 8.
    Multi-Tenancy • • • • 1 ORM instance Multipleconcurrent clients Data specific to each tenant Legacy – Separate SessionFactories for each tenant – Application-provided Connections (given when opening a Session) – Big schemas or many tenants = huge footprint
  • 9.
    Hibernate ORM Multi-Tenancy • • • • Strategy selectionis global Tenant identifier provided when opening a Session Works with 2LC: identifier used in cache data key Custom impls: – MultiTenantConnectionProvider: required for physical and schema separated (required) – CurrentTenantIdentifierResolver: required for opening a Session without providing the tenant id (explicitly or Session#getCurrentSession)
  • 10.
    Hibernate ORM Multi-Tenancy Strategies •Physically separated databases – 1 JDBC connection pool per tenant – Pool selected based on tenant identifier • Single database, separate schemas – Option #1 • Similar to physically separated • 1 JDBC connection pool per tenant • Provides schema through the connection URL or pool – Option #2: • 1 JDBC connection pool using a default schema • Each Connection altered with SQL “SET SCHEMA” prior to use
  • 11.
    Hibernate ORM Multi-Tenancy Strategies •Single database and schema – Data partitioned by discriminator value – Discriminator complexity varies – Each SQL statement altered to include the discriminator – Not yet implemented (planned for ORM 5) – Alternative: @FilterDef/@Filter w/ a tenantId as a param
  • 12.
  • 13.
  • 14.
    Value Generation (Legacy) •Limited to in-database value generation on insert/update • Properties marked with @Generated immediately selected
  • 15.
    Hibernate ORM Value Generation • • • • New,expanded support in ORM 4.3 Supports legacy in-DB generation, but also in-mem Create custom annotations! ORM provides built in generators – @Generated: legacy, providing in-database generation – @CreationTimestamp: set only once when owning entity is saved for the first time – @UpdateTimestamp: set any time owning entity is saved – @GeneratorType: provide custom in-memory generator and define “when” • DEMO • Questions?
  • 16.
  • 17.
    Hibernate Spatial • Currently3rd party, but pulling in as a new ORM module in 5 • Originally created by Karel Maesen (geovise.com) • Java Topology Suite (JTS) – OpenGIS Simple Feature Spec (SFS) & SQL/MM Spatial (extends SFS) – Oracle, Postgres, MySQL, MS SQL, H2, etc. all implement the specs – Attempts to provide abstract, cross-platform geo data, but diffs between them • geolatte-geom – Developed/maintained by Karel – Improvement over JTS – Fully interoperable with JTS – Support for lat/lon geographies – Additional Dialect differences
  • 18.
    Hibernate Spatial (cont'd) •Properties use JTS Geometry types – Point – LineString – Polygon – etc. • Adds HQL functions for Dialect-supported methods – Same functions also implemented as Criteria API Criterions – ex: "select e from Event e where within(e.location, :filter) = true" (:filter is a Geometry) – http://www.hibernatespatial.org/documentation/03-dialects/0 1-overview/
  • 19.
    Hibernate Spatial (cont'd) •Translates between “Well-known text” (WKT) and Geometry types – Spatial object markup language – 2D and 3D – ex: “POINT (30 10)”, “POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))” • Coordinate system transformations possible in queries • Does not require JDBC extension drivers (ex: Oracle SDOAPI.jar or Postgres postgis.jar) • DEMO • Questions?
  • 20.
  • 21.
    Hibernate Envers • Provideshistorical versioning and auditing (“SCM for data”) • Each transaction == a “revision” • Revision #s are global --> querying for a historical snapshot of the entire database is possible • Requires – @Audited on the entity or individual properties – [entity]_AUD tables to store the historical data (DDL created automated if using hbm2ddl, otherwise it’s exportable) • Duplicate data? Yes. • Powerful queries/capabilities > cheap mem • Highly configurable
  • 22.
    Hibernate Envers (cont'd) •Revision info – Default: simple internal entity stored in REVINFO table – Revision # and revision timestamp – Override with custom @RevisionEntity & RevisionListener (add other useful fields: IP address, “blame”, etc.) • Revision entity types – Track the entity types that were changed in each revision – Disabled by default: requires querying tables for changed data – Can be overridden by implementing EntityTrackingRevisionListener on your RevisionEntity
  • 23.
    Hibernate Envers (cont'd) •Revision properties – Track the entity properties that were changed in each revision – Disabled by default: requires querying tables for changed data – Adds boolean columns to audit tables • Queries – Snapshot of entity states at a given revision (horizontal) – Revisions at which entities changed (vertical) • DEMO • Questions? • Conditional auditing – Default: Envers auditing reacts to Hibernate ORM events – Disable hibernate.listeners.envers.autoRegister, create your own listeners, wire them in using Integrator
  • 24.
  • 25.
    Hibernate OSGi • OSGi? •Provide only the OSGi manifest and hacky workarounds <-NO! • Emphasize doing things “the OSGi way” – Dynamic environment – Scoping • Limited visibility into the container • No scanning all bundles • Reduced conflicts, allows concurrent instances, etc. – OSGi services • Isolated in hibernate-osgi module (no pervasive dependencies or OSGi code)
  • 26.
    Hibernate OSGi (cont'd) •3 supported environments – Enterprise OSGi Managed JPA • Container discovers and manages persistence units and EntityManagerFactories • Similar to many app servers, Spring, etc. • Ex: Apache Aries JPA – Un-managed JPA • Direct use of hibernate-entitymanager • EntityManagerFactories created through OSGi services – Native • Direct use of hibernate-core • SessionFactories created through OSGi services • Quickstarts • Questions?
  • 27.
  • 28.
    Hibernate Search • Full-textsearch on the DB – Bad performance – CPU/IO overhead • Offload full-text queries to Hibernate Search engine – Fully indexed – Horizontally scalable • Based on Apache Lucene • “Google for your entities”
  • 29.
    Hibernate Search (cont'd) •Annotate entities with @Indexed • Annotate properties with @Field – Index the text: index=Index.YES – “Analyze” the text: analyze=Analyze.YES • • • • • Lucene analyzer Chunks sentences into words Lowercase all of them Exclude common words (“a”, “the”) Stemming
  • 30.
  • 31.
    Hibernate OGM &Validator • Hibernate OGM: – ORM/JPA support for NoSQL – Infinispan, EHCache, MongoDB, Neo4j • Hibernate Validator – Bean Validation impl, but extended – Both annotation and XML based – @NotNull, @Size(min = 2, max = 14), @Min(2), etc.
  • 32.
  • 33.
    Hibernate Shards • Startedas a Google team's 20% project • Horizontal partitioning across multiple databases • Flexible sharding strategies, both provided and custom • Supports virtual shards: simplifies re-sharding • Typical Hibernate ORM usage: HQL, Criteria, etc. • Last supported ORM version: 3.6.x • Currently has upgrade momentum – contact me if interested!
  • 34.
  • 35.
    Hibernate ORM: Tips, Tricks,and Performance Techniques Tomorrow, 1pm, Ballroom D
  • 36.