Post on 24-Jan-2015
description
Hibernate-Sessions
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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()
71
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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!
72
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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
73
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 );
74
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
Objektzustand-Modell
75
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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!
76
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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!
77
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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()
78
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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()
79
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 )
80
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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
81
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 )
82
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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()
83
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 )
84
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 )
85
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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 )
86
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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()
87
© Oliver P. Schell 2011 www.schellsoft.dePräsentation "Hibernate 3.x"
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
88