SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Hibernate Envers


                    Historisierung mit Hibernate




 Essential Bytes               Autor              1
Envers

       Hibernate-Erweiterung für Historisierung
       Seit 3.5 Teil von Hibernate Core
       Transparente Integration
          Muss nicht explizit aufgerufen werden
          „Läuft überall wo Hibernate läuft“
                    Standalone
                    Application Server
          Integriert sich in JPA
       Einfache Installation: JAR einbinden, fertig




 Essential Bytes                        Autor        2
Vergleich Datenbanklösung

Vorteile gegenüber Triggern, o.ä.
  Revisions-Konzept
  Unterstützt DB-fremde Konzepte wie eingebettete
  Objekte, Klassen-Hierarchien, …
  Weniger Aufwand
     Einfachster Fall: Eine Annotation pro Klasse
     Keine neuen Entity-Klassen notwendig
  Gleiche Entities für akt. Daten & History
  DB-unabhängig
  Einfache aber mächtige Queries


 Essential Bytes          Autor                    3
Einfaches Beispiel

@Entity                               create table Person (
@Audited                                 id bigint not null,
public class Person {                    name varchar(255),
                                         surname varchar(255),
    @Id                                  version bigint,
    @GeneratedValue                      primary key (id)
    private long id;                  );

    @Version                          create table Person_AUD (
    private long version;                id integer not null,
                                         REV integer not null,
    private String name;                 REVTYPE tinyint,
                                         name varchar(255),
    private String surname;              surname varchar(255),
                                         primary key (id, REV)
    …                                 );
}


 Essential Bytes             Autor                               4
Audit-Tabelle

                                      Audit-Suffix (einstellbar)


                 create table Person_AUD (
                   id integer not null,
                   REV integer not null,           Revisions-Nummer
 Revisions-Typ     REVTYPE tinyint,
 (ADD, MOD, DEL)   name varchar(255),
                   surname varchar(255),
                   primary key (id, REV)
                 );




 Essential Bytes             Autor                                   5
Erweitertes Mapping

       Auditing einzelner Attribute statt ganzer Entity
       Jede Menge Annotationen zum Überschreiben von
       Defaults
         Audit-Tabellen-Name
         Ausschließen von Attributen und Relationen
         Überschreiben von Einstellungen einer Eltern-Klasse
         …




 Essential Bytes               Autor                          6
Auditing-Strategien

  1)        Schnelleres Speichern (Default)
             Ein INSERT für jede neue Revision
             Vorteil: INSERTs sind schnell
             Nachteil: Abfragen von Audit-Informationen häufig nur
             mit Subqueries möglich -> Langsam

  2)        Schnellere Queries
             2 Statt 1 Revisions-Attribut: Start- und End-Rev.
             Wann immer möglich nur ein UPDATE auf Ende
             Vorteil: Schnellere Abfragen von Audit-Infos
             Nachteil: UPDATEs sind langsamer als INSERTs

 Essential Bytes                   Autor                            7
Revisions-Log


       Zusätzliche Tabelle
       Speichert Informationen zu jeder Revision
              Revisions-Nummer
              Revisions-Datum
       Default-Name: REVINFO
       Lässt sich erweitern und anpassen
       z.B. um Name des ändernden Benutzers




 Essential Bytes                Autor             8
Erweitertes Logging: Wo?

  Abfrage: „Was hat sich in Rev. 42 geändert?“

       Standard
          Envers muss alle Auditing-Tabellen abfragen
          Vorteil: Speichern bleibt gleichschnell
          Nachteil: Langsame Abfragen

       Alternative
          Log speichert Liste mit geänderten Entity-Namen
          Vorteil: Schnellere Abfragen
          Nachteil: Minimal langsameres Speichern

 Essential Bytes               Autor                       9
Erweitertes Logging: Was?

       Abfragen:
          Welche Attribute wurde von Rev. 42 zu 43 geändert?
          Welche Revisionen haben das Attribut „Name“ geändert?
          …
       Standard:
       Geht nicht
       Alternative
          Logging von geänderten Attributen aktivieren (zusätzliches
          Feld in REVINFO mit Liste geänderter Attributs-Namen)
          Vorteil: Zusätzliche Abfrage-Möglichkeiten
          Nachteil: Minimal langsameres Speichern


 Essential Bytes                  Autor                               10
Abfragen

       Abfragen nur über eigene Query-API
       Queries vergleichsweise eingeschränkt (sollte für
       Aufgabengebiet aber ausreichen)
       Einstieg über AuditReader:
       AuditReader reader =
       AuditReaderFactory.get(entityManager)




 Essential Bytes                Autor                     11
Beispiele

  Revisionsnummern einer Entity suchen:
  List<Number> revisions =
  reader.getRevisions(entityClass, id)

  Bestimmte Revision einer Entity suchen:
  reader.find(entityClass, id, revision)




 Essential Bytes      Autor                12
Beispiele

  Alle Revisionen einer Entity:
  List<Person> persons = reader
     .createQuery()
     .forRevisionsOfEntity(Person.class,
        true, false)
     .getResultList()

  Zu Datum passende Revision:
  reader.getRevisionNumberForDate(date)




 Essential Bytes      Autor               13
Beispiele

  Revisionen in denen sich das Attribut „Name“ beliebiger
  „Person“-Entities geändert hat:
  reader.createQuery().
   forRevisionsOfEntity(Person.class,
       true, false)
   .add(
       AuditEntity.property("name")
       .hasChanged())
   .getResultList()




 Essential Bytes             Autor                         14
Beispiele

  Alle Entities die sich in einer best. Revision geändert
  haben:
  List<Object> entites = reader
  .getCrossTypeRevisionChangesReader()
  .findEntities(2)




 Essential Bytes              Autor                        15
Einschränkungen

       Fehlt, aber ist geplant
         Traversal von Relationen in Queries,
         also kein „… WHERE country.code = ‘DE‘ “
         @Embedded Collections

       Fehlt und ist nicht machbar
         Auditing von Bags (aka Multimaps)




 Essential Bytes              Autor                16
Nachteile

       Etwas schlechtere Performance
       Abfragen nur über neue Query-API
       Revisions-Log in stark belasteten Systemen
       Flaschenhals
       Zusätzliche Tabellen
       Nachträgliche Integration nicht ganz problemlos
       Ein paar Funktionen sind noch experimentell (z.B.
       erweitertes Logging)




 Essential Bytes                Autor                     17

Weitere ähnliche Inhalte

Andere mochten auch

Wach Auf, du deutsches Land
Wach Auf, du deutsches LandWach Auf, du deutsches Land
Wach Auf, du deutsches LandIngo Breuer
 
Offshore Visie
Offshore VisieOffshore Visie
Offshore Visiedvantol
 
Lecturio Law Slideshow
Lecturio Law SlideshowLecturio Law Slideshow
Lecturio Law SlideshowLecturio GmbH
 
Manifest des freien Urchristentums an das deutsche Volk
Manifest des freien Urchristentums an das deutsche VolkManifest des freien Urchristentums an das deutsche Volk
Manifest des freien Urchristentums an das deutsche VolkIngo Breuer
 
Untersuchungsergebnisse
UntersuchungsergebnisseUntersuchungsergebnisse
Untersuchungsergebnissekgohr
 
Vom Gehorsam gegen die Obrigkeit
Vom Gehorsam gegen die ObrigkeitVom Gehorsam gegen die Obrigkeit
Vom Gehorsam gegen die ObrigkeitIngo Breuer
 
Lösung der Huffman-Aufgabe
Lösung der Huffman-AufgabeLösung der Huffman-Aufgabe
Lösung der Huffman-AufgabeINFO LK
 
Du Sollst Nicht Ehebrechen
Du Sollst Nicht EhebrechenDu Sollst Nicht Ehebrechen
Du Sollst Nicht EhebrechenIngo Breuer
 
ZüRich ~
ZüRich ~ZüRich ~
ZüRich ~mary
 
InstallShield 2013 Datasheet
InstallShield 2013 DatasheetInstallShield 2013 Datasheet
InstallShield 2013 DatasheetFlexera
 
ZüRich ~
ZüRich ~ZüRich ~
ZüRich ~mary
 
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf Nahrung
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf NahrungDr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf Nahrung
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf NahrungFritz Lang
 

Andere mochten auch (17)

Wach Auf, du deutsches Land
Wach Auf, du deutsches LandWach Auf, du deutsches Land
Wach Auf, du deutsches Land
 
Offshore Visie
Offshore VisieOffshore Visie
Offshore Visie
 
Presentasjon1
Presentasjon1Presentasjon1
Presentasjon1
 
Lecturio Law Slideshow
Lecturio Law SlideshowLecturio Law Slideshow
Lecturio Law Slideshow
 
Future music camp2010
Future music camp2010Future music camp2010
Future music camp2010
 
Manifest des freien Urchristentums an das deutsche Volk
Manifest des freien Urchristentums an das deutsche VolkManifest des freien Urchristentums an das deutsche Volk
Manifest des freien Urchristentums an das deutsche Volk
 
Untersuchungsergebnisse
UntersuchungsergebnisseUntersuchungsergebnisse
Untersuchungsergebnisse
 
Vom Gehorsam gegen die Obrigkeit
Vom Gehorsam gegen die ObrigkeitVom Gehorsam gegen die Obrigkeit
Vom Gehorsam gegen die Obrigkeit
 
XHTML & CSS Workshop
XHTML & CSS WorkshopXHTML & CSS Workshop
XHTML & CSS Workshop
 
Lösung der Huffman-Aufgabe
Lösung der Huffman-AufgabeLösung der Huffman-Aufgabe
Lösung der Huffman-Aufgabe
 
Du Sollst Nicht Ehebrechen
Du Sollst Nicht EhebrechenDu Sollst Nicht Ehebrechen
Du Sollst Nicht Ehebrechen
 
ZüRich ~
ZüRich ~ZüRich ~
ZüRich ~
 
InstallShield 2013 Datasheet
InstallShield 2013 DatasheetInstallShield 2013 Datasheet
InstallShield 2013 Datasheet
 
ZüRich ~
ZüRich ~ZüRich ~
ZüRich ~
 
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf Nahrung
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf NahrungDr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf Nahrung
Dr. iur. Pedro Bejarano Alomia, LL.B., LL. M. - Menschenrecht auf Nahrung
 
Präsi1.3
Präsi1.3Präsi1.3
Präsi1.3
 
PKset
PKsetPKset
PKset
 

Ähnlich wie Hibernate Envers - Historisierung mit Hibernate

Oracle-DB: Effizient Nutzung von function-based Indizes
Oracle-DB: Effizient Nutzung von function-based IndizesOracle-DB: Effizient Nutzung von function-based Indizes
Oracle-DB: Effizient Nutzung von function-based IndizesPeter Ramm
 
Überblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeÜberblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeAndreas Schreiber
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsPeter Eisentraut
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere RESTMartin Abraham
 
Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Gregor Biswanger
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsPeter Eisentraut
 
Best Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationBest Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationSamuel Zürcher
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code CookbookUlrich Krause
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeos890
 
Samuel Zürcher new power of search
Samuel Zürcher new power of searchSamuel Zürcher new power of search
Samuel Zürcher new power of searchDigicomp Academy AG
 
Webanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnWebanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnRoman Roelofsen
 
SQL 2012: Reporting Services – Reporting und die Infrastruktur
SQL 2012: Reporting Services – Reporting und die InfrastrukturSQL 2012: Reporting Services – Reporting und die Infrastruktur
SQL 2012: Reporting Services – Reporting und die InfrastrukturDigicomp Academy AG
 
Oracle-DB: Systematische Rasterfahndung nach Performance-Antipattern
Oracle-DB: Systematische Rasterfahndung nach Performance-AntipatternOracle-DB: Systematische Rasterfahndung nach Performance-Antipattern
Oracle-DB: Systematische Rasterfahndung nach Performance-AntipatternPeter Ramm
 
Sql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenSql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenCommunardo GmbH
 
Sql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSharepointUGDD
 

Ähnlich wie Hibernate Envers - Historisierung mit Hibernate (20)

SciflowWriter
SciflowWriterSciflowWriter
SciflowWriter
 
Oracle-DB: Effizient Nutzung von function-based Indizes
Oracle-DB: Effizient Nutzung von function-based IndizesOracle-DB: Effizient Nutzung von function-based Indizes
Oracle-DB: Effizient Nutzung von function-based Indizes
 
Windows Powershell
Windows PowershellWindows Powershell
Windows Powershell
 
Überblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeÜberblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle Versionsmanagementsysteme
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-Frontends
 
Ist GraphQL das bessere REST
Ist GraphQL das bessere RESTIst GraphQL das bessere REST
Ist GraphQL das bessere REST
 
Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-Frontends
 
Best Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationBest Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL Installation
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
 
NoSQL CGN: Riak (01/2012)
NoSQL CGN: Riak (01/2012)NoSQL CGN: Riak (01/2012)
NoSQL CGN: Riak (01/2012)
 
The new power of search
The new power of searchThe new power of search
The new power of search
 
Samuel Zürcher new power of search
Samuel Zürcher new power of searchSamuel Zürcher new power of search
Samuel Zürcher new power of search
 
Webanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickelnWebanwendungen mit Apache HBase entwickeln
Webanwendungen mit Apache HBase entwickeln
 
SQL 2012: Reporting Services – Reporting und die Infrastruktur
SQL 2012: Reporting Services – Reporting und die InfrastrukturSQL 2012: Reporting Services – Reporting und die Infrastruktur
SQL 2012: Reporting Services – Reporting und die Infrastruktur
 
Oracle-DB: Systematische Rasterfahndung nach Performance-Antipattern
Oracle-DB: Systematische Rasterfahndung nach Performance-AntipatternOracle-DB: Systematische Rasterfahndung nach Performance-Antipattern
Oracle-DB: Systematische Rasterfahndung nach Performance-Antipattern
 
Sql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenSql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint Administratoren
 
Sql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point Admins
 

Hibernate Envers - Historisierung mit Hibernate

  • 1. Hibernate Envers Historisierung mit Hibernate  Essential Bytes Autor 1
  • 2. Envers Hibernate-Erweiterung für Historisierung Seit 3.5 Teil von Hibernate Core Transparente Integration Muss nicht explizit aufgerufen werden „Läuft überall wo Hibernate läuft“ Standalone Application Server Integriert sich in JPA Einfache Installation: JAR einbinden, fertig  Essential Bytes Autor 2
  • 3. Vergleich Datenbanklösung Vorteile gegenüber Triggern, o.ä. Revisions-Konzept Unterstützt DB-fremde Konzepte wie eingebettete Objekte, Klassen-Hierarchien, … Weniger Aufwand Einfachster Fall: Eine Annotation pro Klasse Keine neuen Entity-Klassen notwendig Gleiche Entities für akt. Daten & History DB-unabhängig Einfache aber mächtige Queries  Essential Bytes Autor 3
  • 4. Einfaches Beispiel @Entity create table Person ( @Audited id bigint not null, public class Person { name varchar(255), surname varchar(255), @Id version bigint, @GeneratedValue primary key (id) private long id; ); @Version create table Person_AUD ( private long version; id integer not null, REV integer not null, private String name; REVTYPE tinyint, name varchar(255), private String surname; surname varchar(255), primary key (id, REV) … ); }  Essential Bytes Autor 4
  • 5. Audit-Tabelle Audit-Suffix (einstellbar) create table Person_AUD ( id integer not null, REV integer not null, Revisions-Nummer Revisions-Typ REVTYPE tinyint, (ADD, MOD, DEL) name varchar(255), surname varchar(255), primary key (id, REV) );  Essential Bytes Autor 5
  • 6. Erweitertes Mapping Auditing einzelner Attribute statt ganzer Entity Jede Menge Annotationen zum Überschreiben von Defaults Audit-Tabellen-Name Ausschließen von Attributen und Relationen Überschreiben von Einstellungen einer Eltern-Klasse …  Essential Bytes Autor 6
  • 7. Auditing-Strategien 1) Schnelleres Speichern (Default) Ein INSERT für jede neue Revision Vorteil: INSERTs sind schnell Nachteil: Abfragen von Audit-Informationen häufig nur mit Subqueries möglich -> Langsam 2) Schnellere Queries 2 Statt 1 Revisions-Attribut: Start- und End-Rev. Wann immer möglich nur ein UPDATE auf Ende Vorteil: Schnellere Abfragen von Audit-Infos Nachteil: UPDATEs sind langsamer als INSERTs  Essential Bytes Autor 7
  • 8. Revisions-Log Zusätzliche Tabelle Speichert Informationen zu jeder Revision Revisions-Nummer Revisions-Datum Default-Name: REVINFO Lässt sich erweitern und anpassen z.B. um Name des ändernden Benutzers  Essential Bytes Autor 8
  • 9. Erweitertes Logging: Wo? Abfrage: „Was hat sich in Rev. 42 geändert?“ Standard Envers muss alle Auditing-Tabellen abfragen Vorteil: Speichern bleibt gleichschnell Nachteil: Langsame Abfragen Alternative Log speichert Liste mit geänderten Entity-Namen Vorteil: Schnellere Abfragen Nachteil: Minimal langsameres Speichern  Essential Bytes Autor 9
  • 10. Erweitertes Logging: Was? Abfragen: Welche Attribute wurde von Rev. 42 zu 43 geändert? Welche Revisionen haben das Attribut „Name“ geändert? … Standard: Geht nicht Alternative Logging von geänderten Attributen aktivieren (zusätzliches Feld in REVINFO mit Liste geänderter Attributs-Namen) Vorteil: Zusätzliche Abfrage-Möglichkeiten Nachteil: Minimal langsameres Speichern  Essential Bytes Autor 10
  • 11. Abfragen Abfragen nur über eigene Query-API Queries vergleichsweise eingeschränkt (sollte für Aufgabengebiet aber ausreichen) Einstieg über AuditReader: AuditReader reader = AuditReaderFactory.get(entityManager)  Essential Bytes Autor 11
  • 12. Beispiele Revisionsnummern einer Entity suchen: List<Number> revisions = reader.getRevisions(entityClass, id) Bestimmte Revision einer Entity suchen: reader.find(entityClass, id, revision)  Essential Bytes Autor 12
  • 13. Beispiele Alle Revisionen einer Entity: List<Person> persons = reader .createQuery() .forRevisionsOfEntity(Person.class, true, false) .getResultList() Zu Datum passende Revision: reader.getRevisionNumberForDate(date)  Essential Bytes Autor 13
  • 14. Beispiele Revisionen in denen sich das Attribut „Name“ beliebiger „Person“-Entities geändert hat: reader.createQuery(). forRevisionsOfEntity(Person.class, true, false) .add( AuditEntity.property("name") .hasChanged()) .getResultList()  Essential Bytes Autor 14
  • 15. Beispiele Alle Entities die sich in einer best. Revision geändert haben: List<Object> entites = reader .getCrossTypeRevisionChangesReader() .findEntities(2)  Essential Bytes Autor 15
  • 16. Einschränkungen Fehlt, aber ist geplant Traversal von Relationen in Queries, also kein „… WHERE country.code = ‘DE‘ “ @Embedded Collections Fehlt und ist nicht machbar Auditing von Bags (aka Multimaps)  Essential Bytes Autor 16
  • 17. Nachteile Etwas schlechtere Performance Abfragen nur über neue Query-API Revisions-Log in stark belasteten Systemen Flaschenhals Zusätzliche Tabellen Nachträgliche Integration nicht ganz problemlos Ein paar Funktionen sind noch experimentell (z.B. erweitertes Logging)  Essential Bytes Autor 17