SlideShare ist ein Scribd-Unternehmen logo
Hibernate-Sessions
Themenüberblick "Hibernate-Sessions"




       Allgemeines über Sessions
       Session-Caches & Flushing
       Objektzustände in Hibernate
       Objektzustand-Modell
       Transitive Persistenzoperationen
       Hibernate-Session-Methoden
       Unterschied zwischen save() und persist()




Präsentation "Hibernate 3.x"          © Oliver P. Schell 2011   www.schellsoft.de   71
Allgemeines über Sessions




                Die Hibernate-Session verwaltet alle JDBC-Ressourcen:
                • JDBC-Connections
                • Zustände aller persistenten Objekte
                • DB-Transaktionen
                • Session-Cache
                  (1st-Level-Cache)
                • VM- oder Cluster-Cache
                   (2cnd-Level-Cache)

                Hierzu stehen verschiedenste Methoden bereit:
                • Methoden zur allgemeinen Verwaltung der Session
                • Methoden zum Umgang mit Connections
                • Methoden zur Persistierung einzelner Objekte
                • Methoden zur Durchführung von Abfragen
                • Methoden zur Verwaltung des Cache
                Bitte allgemein beachten:
                • Niemals Werteobjekte explizit über die Session abspeichern!

Präsentation "Hibernate 3.x"                     © Oliver P. Schell 2011        www.schellsoft.de   72
Session-Caches & Flushing


                Der Session-Cache (1st-Level-Cache) optimiert die Schreibzugriffe:
                • Er observiert alle persistierten Beans
                • SQL-Statements werden erst beim "Flushing" in die DB geschrieben
                Wege in den Session-Cache:
                • Duch Übergabe an die Session:
                   • s.save(     event );
                • Durch Laden aus der Datenbank:
                   • event     = (Event) s.load( Event.class, 17 );

                Flushing = Übertragen von "dirty"-Anweisungen an die Datenbank:
                • Nach einem INSERT, dass einen nativen PK liefert               (automatisch)
                • Vor Queries                                                    (automatisch)
                • Vor einem COMMIT                                               (automatisch)
                • Bei s.flush()                                                  (programmgesteuert)

                Garantierte Operationssequenz beim Flushing:
                • 1) INSERTs in der Reihenfolge der s.save()-Aufrufe
                • 2) UPDATEs
                • 3) Collection DELETEs
                • 4) Collection-Element DELETEs, UPDATEs, INSERTs
                • 5) Alle Entity DELETEs in der Reihenfolge der s.delete()-Aufrufe
Präsentation "Hibernate 3.x"                      © Oliver P. Schell 2011       www.schellsoft.de      73
Objektzustände in Hibernate




                Transient = Bean wurde neu erzeugt oder in DB gelöscht:
                • Objekt besitzt keine Datenbank-Repräsentation
                • Objekt besitzt keinen gültigen Primärschlüssel
                • Objekt ist nicht mit Session-Cache assoziiert
                   • Event     event = new Event();

                Persistent = Bean wird von Hibernate überwacht:
                • Objekt besitzt evtl. eine Datenbank-Repräsentation
                • Objekt besitzt einen (vielleicht temporären) gültigen Primärschlüssel
                • Objekt ist mit Session-Cache assoziiert
                   • s.save(     event );

                Detached = Bean wird von Hibernate nicht überwacht:
                • Objekt besitzt eine Datenbank-Repräsentation
                • Objekt besitzt einen gültigen Primärschlüssel
                • Objekt ist nicht mit Session-Cache assoziiert
                   • s.evict(     event );




Präsentation "Hibernate 3.x"                       © Oliver P. Schell 2011       www.schellsoft.de   74
Objektzustand-Modell




Präsentation "Hibernate 3.x"   © Oliver P. Schell 2011   www.schellsoft.de   75
Konsequenzen der Objektzustände




                Bitte beachten Sie:
                • Änderungen an persistenten Objekten werden erkannt und gespeichert:
                    • s.save( event );
                      event.setCity( "Berlin" );                                  // OBJEKT IST DIRTY!
                      s.getTransaction().commit();
                • Änderungen an detachten Objekten sind für Hibernate nicht erkennbar:
                    • s.save( event );
                      s.getTransaction().commit();
                      event.setCity( "Berlin" );                                  // OBJEKT IST DETACHT!
                • Referenziert ein persistentes Objekt ein transientes, so wird dieses persistent!
                    • person = (Person) s.load( Person.class, 17 );
                      person.getEvents().add( event );                            // OBJEKT IST PERSISTENT!
                      s.getTransaction().commit();
                    " allerdings ist die Cascade-Einstellung für das Persistieren entscheidend!
                •   Detachte Objekte können unvollständig sein:
                    (lazy-loading liefert Proxy, der nur bei persistenten Beans funktioniert!)
                    • person = (Person) s.load( Person.class, 17 );
                      s.close();
                      Hibernate.isInitialized( person.getTermine() );             // FALSE!
                      Hibernate.initialize( person.getTermine() );                // EXCEPTION!




Präsentation "Hibernate 3.x"                        © Oliver P. Schell 2011       www.schellsoft.de      76
Transitive Persistenzoperationen



                Transitive Persistenzoperationen =
                rekursive Anwendung von Session-Operationen:
                • Persistenz-Operationen übertragen sich üblicherweise auf relationale Beans:
                   • s.save(   person );         // SPEICHERT EVTL. ALLE RELATIONALEN OBJEKTE

                Im Falle von Geschäftsbeziehungen:
                • cascade-Attribut im Mapping entscheidet!
                • Flags entsprechen den Session-Methoden-Namen:
                   • <one-to-many   name="personen" cascade="persist, delete, lock">
                • Vorhandene Keys zur Kaskadierung der Operation (none = default!):
                   • create,   merge, save-update, delete, lock, refresh, evict, replicate, none,
                      all
                • Löscht Geschäftsobjekte, wenn sie aus einer Collection entfernt wurden:
                   (nur für one-to-many-Relationen möglich)
                   • cascade="delete-orphan"                      // IST NICHT IN "ALL" ENTHALTEN!

                Im Falle von Wertebeziehungen:
                • "transitive persistence by reachability"
                • Änderung am Geschäftsobjekt / Werteobjekt = Neuspeichern aller Werteobjekte!
                • cascade-Attribut im Mapping ist wirkungslos!

Präsentation "Hibernate 3.x"                      © Oliver P. Schell 2011        www.schellsoft.de   77
Hibernate-Session-Methoden




                Allgemeine Session-Verwaltung:
                • Liefert Entity-Mode der Session:
                   (z.B. RDB, Maps von Maps oder XML-Dateien)
                   • EntityMode      getEntityMode()
                • Öffnet eine neue Session:
                   • Session      getSession( EntityMode entityMode )
                • Liefert die Session-Factory, die diese Session erzeugt hat:
                   • SessionFactory      getSessionFactory()
                • Löscht den Inhalt der Session:
                   (alle geladenen Objekte werden detached)
                   • void      clear()




Präsentation "Hibernate 3.x"                         © Oliver P. Schell 2011    www.schellsoft.de   78
Hibernate-Session-Methoden




                Umgang mit Connections:
                • Ist die Session offen?
                   (z.B. false nach COMMIT oder close() )
                   • boolean      isOpen()
                • Ist die Session mit einer Datenbank verbunden?
                   • boolean      isConnected()
                • Enthält die Session Änderungen?
                   • boolean      isDirty()
                • Liefert die Connection der Session:
                   • Connection        connection()
                • Entkoppelt die Session von der Connection:
                   • Connection        disconnect()
                • Verbindet die Session mit einer Connection:
                   • void      reconnect()
                • Verbindet die Session mit der angegebenen Connection:
                   • void      reconnect( Connection connection )
                • Schließt die Session und gibt die Connection wieder:
                   • Connection        close()




Präsentation "Hibernate 3.x"                        © Oliver P. Schell 2011   www.schellsoft.de   79
Hibernate-Session-Methoden




                Umgang mit einzelnen Objekten:
                • Liefert die ID des angegebenen Objektes:
                   • Serializable      getIdentifier( Object object )
                • Enthält die Session das angegebene Objekt?
                   • boolean      contains( Object object )
                • Entkoppelt das angegebene Objekt von der Session:
                   (wird in "detached" überführt)
                   • void      evict( Object object )
                • Lädt das Objekt mit der angegebenen ID:
                   (liefert Exception im Fehlerfalle)
                   • Object load( Class c, Serializable id, LockMode mode )
                   • Object load( String entityName, Serializable id, LockMode                 mode )
                   • Object load( Class theClass, Serializable id )
                   • Object load( String entityName, Serializable id )
                   • void load( Object object, Serializable id )



Präsentation "Hibernate 3.x"                            © Oliver P. Schell 2011   www.schellsoft.de     80
Hibernate-Session-Methoden




                Umgang mit einzelnen Objekten:
                • Speichert das Objekt erneut:
                   (sendet INSERT, PK-Zustand ist gleichgültig!)
                   • Serializable save( Object object )
                   • void save( Object object, Serializable id )
                   • Serializable save( String entityName, Object            object )
                   • void save( String entityName, Object object,            Serializable id )
                • Speichert das angegebene Objekt:
                   (je nach PK-Zustand wird save() oder update() gerufen)
                   • void      saveOrUpdate( Object object )
                   • void      saveOrUpdate( String entityName, Object object )
                • Persistiert den Zustand des angegebenen detachten Objektes:
                   (flexibleres und konfigurierbares saveOrUpdate())
                   • void      replicate( Object object, ReplicationMode rMode )
                   • void      replicate( String entName, Object o, ReplicationMode m )
                   verfügbare Replication-Modi:
                   • EXCEPTION,      IGNORE, OVERWRITE, LATEST_VERSION




Präsentation "Hibernate 3.x"                       © Oliver P. Schell 2011       www.schellsoft.de   81
Hibernate-Session-Methoden




                Umgang mit einzelnen Objekten:
                • Aktualisiert ein detachtes Objekt
                   (sendet statisches UPDATE, vollständiger Abgleich aller Attribute,
                    PK muss gültig sein, sonst wird Exception geworfen!)
                   • void      update(   Object   object )
                   • void      update(   Object   object, Serializable id )
                   • void      update(   String   entityName, Object object )
                   • void      update(   String   entityName, Object object, Serializable id )
                • Kopiert Inhalte eines detachten Objekts in eine persistente Instanz:
                   (falls in der Session keine passende Instanz liegt, wird sie aus DB geladen)
                   • Object      merge( Object object )
                   • Object      merge( String entityName, Object object )
                   teilweiser & dynamischer Abgleich detacht geänderter Attribute möglich:
                   • <class      dynamic-update="true">
                • Persistiert ein Objekt:
                   (der Unterschied zu save() wird im Folgenden geklärt)
                   • void      persist( Object object )
                   • void      persist( String entityName, Object object )




Präsentation "Hibernate 3.x"                          © Oliver P. Schell 2011     www.schellsoft.de   82
Hibernate-Session-Methoden




                Umgang mit einzelnen Objekten:
                • Löscht das übergebene Objekt aus der DB:
                   (Objekt muss lediglich eine gültige ID haben, der Zustand ist egal)
                   • void      delete( Object object )
                   • void      delete( String entityName, Object object )
                • Sperrt ein detachtes oder persistentes Objekt:
                   (detachte Instanzen müssen unverändert sein)
                   • void      lock( Object object, LockMode lockMode )
                   • void      lock( String entityName, Object object, LockMode mode )
                • Aktualisiert den Objektzustand aus der Datenbank:
                   (ohne auf den Cache zuzugreifen)
                   • void      refresh( Object object )
                   • void      refresh( Object object, LockMode lockMode )
                • Liefert den Sperrmodus für das angegebene Objekt:
                   • LockMode      getCurrentLockMode( Object object )
                • Startet eine Transaktion:
                   • Transaction      beginTransaction()




Präsentation "Hibernate 3.x"                        © Oliver P. Schell 2011       www.schellsoft.de   83
Hibernate-Session-Methoden




                Umgang mit einzelnen Objekten:
                • Liefert das Transaction-Objekt, das mit dieser Session assoziiert ist:
                   • Transaction        getTransaction()
                • Liefert das Objekt mit der angegebenen ID
                   (oder NULL im Fehlerfalle):
                   • Object      get(   Class clazz, Serializable id )
                   • Object      get(   Class clazz, Serializable id, LockMode lockMode )
                   • Object      get(   String entityName, Serializable id )
                   • Object      get(   String entityName, Serializable id, LockMode mode )
                • Liefert den Entity-Namen für das angegebene persistente Objekt:
                   (Entity-Name muss in der Mapping-Datei definiert sein)
                   • String      getEntityName( Object object )
                • Definiert das angegebene Objekt als Readonly-Objekt:
                   (es findet kein Dirty-Checking statt)
                   • void      setReadOnly( Object entity, boolean readonly )




Präsentation "Hibernate 3.x"                         © Oliver P. Schell 2011      www.schellsoft.de   84
Hibernate-Session-Methoden




                Umgang mit Abfragen:
                • Erzeugt eine Abfrage, die alle Objekte vom angegebenen Typ liefert:
                   • Criteria     createCriteria( Class persistentClass )
                   • Criteria     createCriteria( Class persistentClass, String alias )
                • Erzeugt eine Abfrage für alle Objekte mit angegebenem Entity-Namen:
                   • Criteria  createCriteria( String entityName )
                      Criteria createCriteria( String entityName, String alias )
                • Erzeugt eine Abfrage mit der angegebenen HQL-Abfrage:
                   • Query     createQuery( String queryString )
                • Erzeugt eine Abfrage mit der angegebenen SQL-Abfrage:
                   • SQLQuery     createSQLQuery( String queryString )
                • Erzeugt eine Abfrage für die angegebene persistente Collection und den angegebenen Filter
                   (HQL):
                   • Filter     createFilter( Object collection, String queryString )




Präsentation "Hibernate 3.x"                     © Oliver P. Schell 2011       www.schellsoft.de      85
Hibernate-Session-Methoden




                Umgang mit Abfragen:
                • Liefert die benannte Abfrage mit dem angegebenen Namen:
                   • Query      getNamedQuery( String queryName )
                • Bricht die aktuelle Abfrage (z.B. aus parallelem Thread) ab:
                   • void      cancelQuery()
                • Aktiviert den angegebenen Filter für diese Session:
                   • Filter      enableFilter( String filterName )
                • Liefert den aktiven Filter mit dem angegebenen Namen:
                   • Filter      getEnabledFilter( String filterName )
                • Deaktiviert den angegebenen Filter für diese Session:
                   • void      disableFilter( String filterName )




Präsentation "Hibernate 3.x"                       © Oliver P. Schell 2011       www.schellsoft.de   86
Hibernate-Session-Methoden




                Umgang mit dem Cache:
                • Schreibt die Änderungen im Cache in die Datenbank:
                   • void      flush()
                • Setzt den Flush-Modus:
                   (Default-Wert ist auto = flushing vor SQL-Queries und vor Transaktionen)
                   • void      setFlushMode( FlushMode flushMode )
                • Liefert den Flush-Modus:
                   • FlushMode      getFlushMode()
                • Setzt den Second-Level-Cache-Modus:
                   • void      setCacheMode( CacheMode cacheMode )
                • Liefert den Cache-Modus:
                   • CacheMode      getCacheMode()




Präsentation "Hibernate 3.x"                         © Oliver P. Schell 2011     www.schellsoft.de   87
Unterschied zw. save() und persist()




                Die Unterschiede zw. save() und persist() sind eher akademisch!
                Es geht um 2 Fragen:
                • In welchem Zustand muss die Bean sein, um eingefügt zu werden?
                • Wann genau wird der PK eines eingefügten Objekts ermittelt?
                save():
                • Speichert sowohl transiente als auch detachte Objekte
                • Der PK wird sofort ermittelt,
                   evtl. auch durch ein INSERT außerhalb der Transaktionsgrenzen!

                persist():
                • Speichert nur transiente, aber keine detachten Objekte
                • Hibernate garantiert:
                   persist() erzeugt kein INSERT außerhalb der Transaktionsgrenzen




Präsentation "Hibernate 3.x"                      © Oliver P. Schell 2011     www.schellsoft.de   88

Weitere ähnliche Inhalte

Andere mochten auch

Facebook und Redmine in der Lehre - eine Bestandsaufnahme
Facebook und Redmine in der Lehre - eine BestandsaufnahmeFacebook und Redmine in der Lehre - eine Bestandsaufnahme
Facebook und Redmine in der Lehre - eine Bestandsaufnahme
Hochschule der Medien
 
Paul klee
Paul kleePaul klee
Paul klee
noemicervera
 
Desarrollo embrionario de la cara y de la
Desarrollo embrionario de la cara y de laDesarrollo embrionario de la cara y de la
Desarrollo embrionario de la cara y de la
Diego Vladimir
 
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
Swiss eHealth Forum
 
Guided Navigation (Faceted Search)
Guided Navigation (Faceted Search)Guided Navigation (Faceted Search)
Guided Navigation (Faceted Search)
Walter Schärer
 
10 Redenen Om Ons Uw Inkoper Te Laten Werven
10 Redenen Om Ons Uw Inkoper Te Laten Werven10 Redenen Om Ons Uw Inkoper Te Laten Werven
10 Redenen Om Ons Uw Inkoper Te Laten Werven
mikedejongh
 
Bericht Njinikom SES Juni Juli 2014
Bericht Njinikom SES Juni Juli 2014Bericht Njinikom SES Juni Juli 2014
Bericht Njinikom SES Juni Juli 2014
Carsten Tiede
 
Johannes Piscator - Bibel Präsentation (PPT)
Johannes Piscator - Bibel Präsentation (PPT)Johannes Piscator - Bibel Präsentation (PPT)
Johannes Piscator - Bibel Präsentation (PPT)
SepherVerlag
 
Partner eh3 externe-tour
Partner eh3 externe-tourPartner eh3 externe-tour
Partner eh3 externe-tour
redtree01
 
Peter Drucker e Henry Ford
Peter Drucker e Henry FordPeter Drucker e Henry Ford
Peter Drucker e Henry Ford
Lena Marques
 
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
Frederic Jaeckel
 
Microsoft Dynamics CRM und Social Networking
Microsoft Dynamics CRM und Social NetworkingMicrosoft Dynamics CRM und Social Networking
Microsoft Dynamics CRM und Social Networking
Custemotion Unternehmensberatung UG (haftungsbeschränkt)
 
Tutorial controltoolbox
Tutorial controltoolboxTutorial controltoolbox
Tutorial controltoolbox
RUBEN ALEGRE MENDEZ
 
Holocausto nuclear Jorge Viguer
Holocausto nuclear Jorge ViguerHolocausto nuclear Jorge Viguer
Holocausto nuclear Jorge Viguer
ProyectoHistoriaDomus
 
Cib2013 programm
Cib2013 programmCib2013 programm
Cib2013 programm
ICV_eV
 
De la cru sanchez jerson
De la cru sanchez jersonDe la cru sanchez jerson
De la cru sanchez jerson
Jerson de la Cruz
 
Manuales prezi y blogger
Manuales prezi y bloggerManuales prezi y blogger
Manuales prezi y blogger
tabatha96
 
Plan de trabajo
Plan de trabajoPlan de trabajo
Plan de trabajo
Bryan Andrés Sabogal
 

Andere mochten auch (20)

Facebook und Redmine in der Lehre - eine Bestandsaufnahme
Facebook und Redmine in der Lehre - eine BestandsaufnahmeFacebook und Redmine in der Lehre - eine Bestandsaufnahme
Facebook und Redmine in der Lehre - eine Bestandsaufnahme
 
Paul klee
Paul kleePaul klee
Paul klee
 
Desarrollo embrionario de la cara y de la
Desarrollo embrionario de la cara y de laDesarrollo embrionario de la cara y de la
Desarrollo embrionario de la cara y de la
 
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
SeHF 2015 | Überweisung per Knopfdruck – Umsetzung einer benutzergerechten Zu...
 
Guided Navigation (Faceted Search)
Guided Navigation (Faceted Search)Guided Navigation (Faceted Search)
Guided Navigation (Faceted Search)
 
Das honigkuchenherz
Das honigkuchenherzDas honigkuchenherz
Das honigkuchenherz
 
Highlights Sage CRM 7.1
Highlights Sage CRM 7.1Highlights Sage CRM 7.1
Highlights Sage CRM 7.1
 
10 Redenen Om Ons Uw Inkoper Te Laten Werven
10 Redenen Om Ons Uw Inkoper Te Laten Werven10 Redenen Om Ons Uw Inkoper Te Laten Werven
10 Redenen Om Ons Uw Inkoper Te Laten Werven
 
Bericht Njinikom SES Juni Juli 2014
Bericht Njinikom SES Juni Juli 2014Bericht Njinikom SES Juni Juli 2014
Bericht Njinikom SES Juni Juli 2014
 
Johannes Piscator - Bibel Präsentation (PPT)
Johannes Piscator - Bibel Präsentation (PPT)Johannes Piscator - Bibel Präsentation (PPT)
Johannes Piscator - Bibel Präsentation (PPT)
 
Partner eh3 externe-tour
Partner eh3 externe-tourPartner eh3 externe-tour
Partner eh3 externe-tour
 
Peter Drucker e Henry Ford
Peter Drucker e Henry FordPeter Drucker e Henry Ford
Peter Drucker e Henry Ford
 
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
Automatisierungstechnologien fuer-die-infrastruktur-mit-Chef - EH2011
 
Microsoft Dynamics CRM und Social Networking
Microsoft Dynamics CRM und Social NetworkingMicrosoft Dynamics CRM und Social Networking
Microsoft Dynamics CRM und Social Networking
 
Tutorial controltoolbox
Tutorial controltoolboxTutorial controltoolbox
Tutorial controltoolbox
 
Holocausto nuclear Jorge Viguer
Holocausto nuclear Jorge ViguerHolocausto nuclear Jorge Viguer
Holocausto nuclear Jorge Viguer
 
Cib2013 programm
Cib2013 programmCib2013 programm
Cib2013 programm
 
De la cru sanchez jerson
De la cru sanchez jersonDe la cru sanchez jerson
De la cru sanchez jerson
 
Manuales prezi y blogger
Manuales prezi y bloggerManuales prezi y blogger
Manuales prezi y blogger
 
Plan de trabajo
Plan de trabajoPlan de trabajo
Plan de trabajo
 

Ähnlich wie Auszug Seminarunterlagen "Hibernate 3.x"

Caching in Hibernate
Caching in HibernateCaching in Hibernate
Caching in Hibernate
Michael Plöd
 
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
Michael Whittaker
 
Oracle Datenbank-Architektur
Oracle Datenbank-ArchitekturOracle Datenbank-Architektur
Oracle Datenbank-Architektur
Markus Flechtner
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
Daniel Havlik
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
Oliver Belikan
 
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und HibernateEffiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
Thorben Janssen
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
AOE
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
Mario Müller
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
OPEN KNOWLEDGE GmbH
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)
Michael Romer
 
Ausgewählte Performance Technologien
Ausgewählte Performance TechnologienAusgewählte Performance Technologien
Ausgewählte Performance Technologien
oraclebudb
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
Sebastian Springer
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
gedoplan
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
s0enke
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
Chris Michael Klinger
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
Sascha Koch
 
"git.net" gibt's nicht?
"git.net" gibt's nicht?"git.net" gibt's nicht?
"git.net" gibt's nicht?
inovex GmbH
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
Josef Adersberger
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
QAware GmbH
 

Ähnlich wie Auszug Seminarunterlagen "Hibernate 3.x" (20)

Caching in Hibernate
Caching in HibernateCaching in Hibernate
Caching in Hibernate
 
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
Welches Versionskontrollsystem sollte ich nutzen? (SVN, Git, Hg)
 
Oracle Datenbank-Architektur
Oracle Datenbank-ArchitekturOracle Datenbank-Architektur
Oracle Datenbank-Architektur
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
 
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und HibernateEffiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)
 
Ausgewählte Performance Technologien
Ausgewählte Performance TechnologienAusgewählte Performance Technologien
Ausgewählte Performance Technologien
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Digicomp sqlday alwayson
Digicomp sqlday alwaysonDigicomp sqlday alwayson
Digicomp sqlday alwayson
 
"git.net" gibt's nicht?
"git.net" gibt's nicht?"git.net" gibt's nicht?
"git.net" gibt's nicht?
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 

Auszug Seminarunterlagen "Hibernate 3.x"

  • 2. Themenüberblick "Hibernate-Sessions" Allgemeines über Sessions Session-Caches & Flushing Objektzustände in Hibernate Objektzustand-Modell Transitive Persistenzoperationen Hibernate-Session-Methoden Unterschied zwischen save() und persist() Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 71
  • 3. Allgemeines über Sessions Die Hibernate-Session verwaltet alle JDBC-Ressourcen: • JDBC-Connections • Zustände aller persistenten Objekte • DB-Transaktionen • Session-Cache (1st-Level-Cache) • VM- oder Cluster-Cache (2cnd-Level-Cache) Hierzu stehen verschiedenste Methoden bereit: • Methoden zur allgemeinen Verwaltung der Session • Methoden zum Umgang mit Connections • Methoden zur Persistierung einzelner Objekte • Methoden zur Durchführung von Abfragen • Methoden zur Verwaltung des Cache Bitte allgemein beachten: • Niemals Werteobjekte explizit über die Session abspeichern! Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 72
  • 4. Session-Caches & Flushing Der Session-Cache (1st-Level-Cache) optimiert die Schreibzugriffe: • Er observiert alle persistierten Beans • SQL-Statements werden erst beim "Flushing" in die DB geschrieben Wege in den Session-Cache: • Duch Übergabe an die Session: • s.save( event ); • Durch Laden aus der Datenbank: • event = (Event) s.load( Event.class, 17 ); Flushing = Übertragen von "dirty"-Anweisungen an die Datenbank: • Nach einem INSERT, dass einen nativen PK liefert (automatisch) • Vor Queries (automatisch) • Vor einem COMMIT (automatisch) • Bei s.flush() (programmgesteuert) Garantierte Operationssequenz beim Flushing: • 1) INSERTs in der Reihenfolge der s.save()-Aufrufe • 2) UPDATEs • 3) Collection DELETEs • 4) Collection-Element DELETEs, UPDATEs, INSERTs • 5) Alle Entity DELETEs in der Reihenfolge der s.delete()-Aufrufe Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 73
  • 5. Objektzustände in Hibernate Transient = Bean wurde neu erzeugt oder in DB gelöscht: • Objekt besitzt keine Datenbank-Repräsentation • Objekt besitzt keinen gültigen Primärschlüssel • Objekt ist nicht mit Session-Cache assoziiert • Event event = new Event(); Persistent = Bean wird von Hibernate überwacht: • Objekt besitzt evtl. eine Datenbank-Repräsentation • Objekt besitzt einen (vielleicht temporären) gültigen Primärschlüssel • Objekt ist mit Session-Cache assoziiert • s.save( event ); Detached = Bean wird von Hibernate nicht überwacht: • Objekt besitzt eine Datenbank-Repräsentation • Objekt besitzt einen gültigen Primärschlüssel • Objekt ist nicht mit Session-Cache assoziiert • s.evict( event ); Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 74
  • 6. Objektzustand-Modell Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 75
  • 7. Konsequenzen der Objektzustände Bitte beachten Sie: • Änderungen an persistenten Objekten werden erkannt und gespeichert: • s.save( event ); event.setCity( "Berlin" ); // OBJEKT IST DIRTY! s.getTransaction().commit(); • Änderungen an detachten Objekten sind für Hibernate nicht erkennbar: • s.save( event ); s.getTransaction().commit(); event.setCity( "Berlin" ); // OBJEKT IST DETACHT! • Referenziert ein persistentes Objekt ein transientes, so wird dieses persistent! • person = (Person) s.load( Person.class, 17 ); person.getEvents().add( event ); // OBJEKT IST PERSISTENT! s.getTransaction().commit(); " allerdings ist die Cascade-Einstellung für das Persistieren entscheidend! • Detachte Objekte können unvollständig sein: (lazy-loading liefert Proxy, der nur bei persistenten Beans funktioniert!) • person = (Person) s.load( Person.class, 17 ); s.close(); Hibernate.isInitialized( person.getTermine() ); // FALSE! Hibernate.initialize( person.getTermine() ); // EXCEPTION! Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 76
  • 8. Transitive Persistenzoperationen Transitive Persistenzoperationen = rekursive Anwendung von Session-Operationen: • Persistenz-Operationen übertragen sich üblicherweise auf relationale Beans: • s.save( person ); // SPEICHERT EVTL. ALLE RELATIONALEN OBJEKTE Im Falle von Geschäftsbeziehungen: • cascade-Attribut im Mapping entscheidet! • Flags entsprechen den Session-Methoden-Namen: • <one-to-many name="personen" cascade="persist, delete, lock"> • Vorhandene Keys zur Kaskadierung der Operation (none = default!): • create, merge, save-update, delete, lock, refresh, evict, replicate, none, all • Löscht Geschäftsobjekte, wenn sie aus einer Collection entfernt wurden: (nur für one-to-many-Relationen möglich) • cascade="delete-orphan" // IST NICHT IN "ALL" ENTHALTEN! Im Falle von Wertebeziehungen: • "transitive persistence by reachability" • Änderung am Geschäftsobjekt / Werteobjekt = Neuspeichern aller Werteobjekte! • cascade-Attribut im Mapping ist wirkungslos! Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 77
  • 9. Hibernate-Session-Methoden Allgemeine Session-Verwaltung: • Liefert Entity-Mode der Session: (z.B. RDB, Maps von Maps oder XML-Dateien) • EntityMode getEntityMode() • Öffnet eine neue Session: • Session getSession( EntityMode entityMode ) • Liefert die Session-Factory, die diese Session erzeugt hat: • SessionFactory getSessionFactory() • Löscht den Inhalt der Session: (alle geladenen Objekte werden detached) • void clear() Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 78
  • 10. Hibernate-Session-Methoden Umgang mit Connections: • Ist die Session offen? (z.B. false nach COMMIT oder close() ) • boolean isOpen() • Ist die Session mit einer Datenbank verbunden? • boolean isConnected() • Enthält die Session Änderungen? • boolean isDirty() • Liefert die Connection der Session: • Connection connection() • Entkoppelt die Session von der Connection: • Connection disconnect() • Verbindet die Session mit einer Connection: • void reconnect() • Verbindet die Session mit der angegebenen Connection: • void reconnect( Connection connection ) • Schließt die Session und gibt die Connection wieder: • Connection close() Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 79
  • 11. Hibernate-Session-Methoden Umgang mit einzelnen Objekten: • Liefert die ID des angegebenen Objektes: • Serializable getIdentifier( Object object ) • Enthält die Session das angegebene Objekt? • boolean contains( Object object ) • Entkoppelt das angegebene Objekt von der Session: (wird in "detached" überführt) • void evict( Object object ) • Lädt das Objekt mit der angegebenen ID: (liefert Exception im Fehlerfalle) • Object load( Class c, Serializable id, LockMode mode ) • Object load( String entityName, Serializable id, LockMode mode ) • Object load( Class theClass, Serializable id ) • Object load( String entityName, Serializable id ) • void load( Object object, Serializable id ) Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 80
  • 12. Hibernate-Session-Methoden Umgang mit einzelnen Objekten: • Speichert das Objekt erneut: (sendet INSERT, PK-Zustand ist gleichgültig!) • Serializable save( Object object ) • void save( Object object, Serializable id ) • Serializable save( String entityName, Object object ) • void save( String entityName, Object object, Serializable id ) • Speichert das angegebene Objekt: (je nach PK-Zustand wird save() oder update() gerufen) • void saveOrUpdate( Object object ) • void saveOrUpdate( String entityName, Object object ) • Persistiert den Zustand des angegebenen detachten Objektes: (flexibleres und konfigurierbares saveOrUpdate()) • void replicate( Object object, ReplicationMode rMode ) • void replicate( String entName, Object o, ReplicationMode m ) verfügbare Replication-Modi: • EXCEPTION, IGNORE, OVERWRITE, LATEST_VERSION Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 81
  • 13. Hibernate-Session-Methoden Umgang mit einzelnen Objekten: • Aktualisiert ein detachtes Objekt (sendet statisches UPDATE, vollständiger Abgleich aller Attribute, PK muss gültig sein, sonst wird Exception geworfen!) • void update( Object object ) • void update( Object object, Serializable id ) • void update( String entityName, Object object ) • void update( String entityName, Object object, Serializable id ) • Kopiert Inhalte eines detachten Objekts in eine persistente Instanz: (falls in der Session keine passende Instanz liegt, wird sie aus DB geladen) • Object merge( Object object ) • Object merge( String entityName, Object object ) teilweiser & dynamischer Abgleich detacht geänderter Attribute möglich: • <class dynamic-update="true"> • Persistiert ein Objekt: (der Unterschied zu save() wird im Folgenden geklärt) • void persist( Object object ) • void persist( String entityName, Object object ) Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 82
  • 14. Hibernate-Session-Methoden Umgang mit einzelnen Objekten: • Löscht das übergebene Objekt aus der DB: (Objekt muss lediglich eine gültige ID haben, der Zustand ist egal) • void delete( Object object ) • void delete( String entityName, Object object ) • Sperrt ein detachtes oder persistentes Objekt: (detachte Instanzen müssen unverändert sein) • void lock( Object object, LockMode lockMode ) • void lock( String entityName, Object object, LockMode mode ) • Aktualisiert den Objektzustand aus der Datenbank: (ohne auf den Cache zuzugreifen) • void refresh( Object object ) • void refresh( Object object, LockMode lockMode ) • Liefert den Sperrmodus für das angegebene Objekt: • LockMode getCurrentLockMode( Object object ) • Startet eine Transaktion: • Transaction beginTransaction() Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 83
  • 15. Hibernate-Session-Methoden Umgang mit einzelnen Objekten: • Liefert das Transaction-Objekt, das mit dieser Session assoziiert ist: • Transaction getTransaction() • Liefert das Objekt mit der angegebenen ID (oder NULL im Fehlerfalle): • Object get( Class clazz, Serializable id ) • Object get( Class clazz, Serializable id, LockMode lockMode ) • Object get( String entityName, Serializable id ) • Object get( String entityName, Serializable id, LockMode mode ) • Liefert den Entity-Namen für das angegebene persistente Objekt: (Entity-Name muss in der Mapping-Datei definiert sein) • String getEntityName( Object object ) • Definiert das angegebene Objekt als Readonly-Objekt: (es findet kein Dirty-Checking statt) • void setReadOnly( Object entity, boolean readonly ) Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 84
  • 16. Hibernate-Session-Methoden Umgang mit Abfragen: • Erzeugt eine Abfrage, die alle Objekte vom angegebenen Typ liefert: • Criteria createCriteria( Class persistentClass ) • Criteria createCriteria( Class persistentClass, String alias ) • Erzeugt eine Abfrage für alle Objekte mit angegebenem Entity-Namen: • Criteria createCriteria( String entityName ) Criteria createCriteria( String entityName, String alias ) • Erzeugt eine Abfrage mit der angegebenen HQL-Abfrage: • Query createQuery( String queryString ) • Erzeugt eine Abfrage mit der angegebenen SQL-Abfrage: • SQLQuery createSQLQuery( String queryString ) • Erzeugt eine Abfrage für die angegebene persistente Collection und den angegebenen Filter (HQL): • Filter createFilter( Object collection, String queryString ) Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 85
  • 17. Hibernate-Session-Methoden Umgang mit Abfragen: • Liefert die benannte Abfrage mit dem angegebenen Namen: • Query getNamedQuery( String queryName ) • Bricht die aktuelle Abfrage (z.B. aus parallelem Thread) ab: • void cancelQuery() • Aktiviert den angegebenen Filter für diese Session: • Filter enableFilter( String filterName ) • Liefert den aktiven Filter mit dem angegebenen Namen: • Filter getEnabledFilter( String filterName ) • Deaktiviert den angegebenen Filter für diese Session: • void disableFilter( String filterName ) Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 86
  • 18. Hibernate-Session-Methoden Umgang mit dem Cache: • Schreibt die Änderungen im Cache in die Datenbank: • void flush() • Setzt den Flush-Modus: (Default-Wert ist auto = flushing vor SQL-Queries und vor Transaktionen) • void setFlushMode( FlushMode flushMode ) • Liefert den Flush-Modus: • FlushMode getFlushMode() • Setzt den Second-Level-Cache-Modus: • void setCacheMode( CacheMode cacheMode ) • Liefert den Cache-Modus: • CacheMode getCacheMode() Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 87
  • 19. Unterschied zw. save() und persist() Die Unterschiede zw. save() und persist() sind eher akademisch! Es geht um 2 Fragen: • In welchem Zustand muss die Bean sein, um eingefügt zu werden? • Wann genau wird der PK eines eingefügten Objekts ermittelt? save(): • Speichert sowohl transiente als auch detachte Objekte • Der PK wird sofort ermittelt, evtl. auch durch ein INSERT außerhalb der Transaktionsgrenzen! persist(): • Speichert nur transiente, aber keine detachten Objekte • Hibernate garantiert: persist() erzeugt kein INSERT außerhalb der Transaktionsgrenzen Präsentation "Hibernate 3.x" © Oliver P. Schell 2011 www.schellsoft.de 88