Contenu connexe
Similaire à Auszug Seminarunterlagen "Hibernate 3.x"
Similaire à Auszug Seminarunterlagen "Hibernate 3.x" (20)
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
- 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