SlideShare une entreprise Scribd logo
1  sur  69
Télécharger pour lire hors ligne
Effiziente Datenpersistierung
mit JPA 2.1
www.thoughts-on-java.org
Thorben Janssen
• Senior Entwickler und Architekt @ Qualitype GmbH
• CDI 2.0 (JSR 365) Expert Group Mitglied
• Twitter: @thjanssen123
• Blog: www.thoughts-on-java.org
www.thoughts-on-java.org
Beispielanwendung
www.thoughts-on-java.org
www.thoughts-on-java.org
Anwendung
Was bedeutet Effizienz?
www.thoughts-on-java.org
Performance
SpeicherplatzProduktivität
Xwww.thoughts-on-java.org
X
Effizienz
Performance
www.thoughts-on-java.org
• Frühzeitiges Erkennen von Performanceproblemen
• Typische Ursachen von Performanceproblemen
• Performanceprobleme beheben und vermeiden
www.thoughts-on-java.org
Performance
Auftreten von
Performanceproblemen
www.thoughts-on-java.org
• Ein Kunde meldet ein langsames System
• Der DBA fragt nach dem Grund für sehr viele (ähnliche) Abfragen
• Schlechte Performance beim Test der Anwendung
• Entwickler sieht auffällige Statistiken im Log
www.thoughts-on-java.org
Performanceprobleme
Hibernate Statistics
www.thoughts-on-java.org
• Über Systemproperty aktivieren:
hibernate.generate_statistics = true
• Logging konfigurieren:
org.hibernate.stat = DEBUG
www.thoughts-on-java.org
HibernateStatistics
Demo (Projekt Model)
www.thoughts-on-java.org
Ursachen von
Performanceproblemen
www.thoughts-on-java.org
• Langsame Select-Statements
• Falsche Fetch-Strategie
• Fehlendes Caching
• Laden nicht benötigter Daten
• Datensätze einzeln löschen oder ändern
• Logik in der Anwendung anstatt der Datenbank/Abfrage
www.thoughts-on-java.org
HäufigeUrsachen
1. Langsame Select-Statements
www.thoughts-on-java.org
• Meistens kein „echtes“ JPA- oder Hibernateproblem
• Erzeugtes SQL überprüfen
• Indexe überprüfen
• Ausführungsplan des Statements überprüfen
• Ggf. Ergebnismenge beschränken (paging)
• Statement optimieren
• Native SQL-Statements verwenden, wenn JPQL nicht ausreicht
www.thoughts-on-java.org
LangsameSelects
• Schnellere Abfragen durch echtes SQL
• JPQL unterstützt nur ein Subset von SQL
• Datenbankspezifische SQL-Features
• Native Query liefert Object[] für jede Ergebniszeile
• Erfordert programmatisches oder deklaratives Mapping
www.thoughts-on-java.org
NativeQuery
• Deklaratives Mapping für Abfrageergebnisse
• Unterstützte Zieltypen:
• Entities
• Value Objekte
• Skalare
www.thoughts-on-java.org
ResultSetMapping
Demo (Projekt NativeQuery)
www.thoughts-on-java.org
2. Fetch-Strategien
www.thoughts-on-java.org
• Statische Definition im Mapping
• Fragestellungen
• Wann soll geladen werden?  FetchType
• Wie soll geladen werden?  FetchMode
www.thoughts-on-java.org
Fetch-Stratgien
2.1 FetchType
www.thoughts-on-java.org
• Lazy
• Relation wird bei erstem Zugriff geladen
• Default für to-many Relationen
• Verwendet Proxies für to-one Relationen
• Eager
• Relation wird sofort geladen
• Default für to-one Relationen
www.thoughts-on-java.org
FetchType
• Hibernate erzeugt Proxy für lazy to-one-Relationen
• Proxy ist Subklasse der Entity
• Instanceof möglich
• Typecast auf Subklasse nicht möglich
• Alternative: bytecode enhancement ohne Proxy
www.thoughts-on-java.org
To-onemitProxy
Demo (Projekt EagerLoading)
www.thoughts-on-java.org
2.2 FetchMode
www.thoughts-on-java.org
• Hibernate spezifisch
• Definiert wie Relationen geladen werden
• JOIN = im selben SELECT
• SELECT = 1 SELECT je Entity der Relation
• SUBSELECT = 1 SELECT für alle Entities der Relation
• BATCH = mehrere Entities der Relation je SELECT
www.thoughts-on-java.org
FetchMode
Demo (Projekt EagerLoading)
www.thoughts-on-java.org
• To-many-Relationen
• Default in Annotationen belassen (meist FetchType.LAZY)
• Eager fetching, wenn benötigt für Query definieren
• To-one-Relationen
• Einzeln prüfen, meist ist der default OK
www.thoughts-on-java.org
Empfehlung
2.3 Queryspezifisches
Fetching
www.thoughts-on-java.org
• Entsteht, wenn lazy Relationen beim Zugriff nachgeladen werden
List<Author> authors = this.em.createQuery("SELECT a FROM Author a",
Author.class).getResultList();
for (Author a : authors) {
System.out.println("Author " + a.getFirstName() + " " + a.getLastName() + "
wrote " + a.getBooks().stream().map(b -> b.getTitle()).collect(Collectors.joining(", ")));
}
www.thoughts-on-java.org
N+1Selects
Demo (Projekt LazyLoading)
www.thoughts-on-java.org
• Besser, benötigte Relationen direkt mit laden:
• (FetchType.EAGER)
• Fetch Join
• @NamedEntityGraph
• EntityGraph
www.thoughts-on-java.org
N+1Selects
• Verwendung von JOIN FETCH anstatt JOIN in Abfrage
List<Author> authors = this.em.createQuery("SELECT DISTINCT a FROM Author a JOIN
FETCH a.books b", Author.class).getResultList();
for (Author a : authors) {
System.out.println("Author " + a.getFirstName() + " " + a.getLastName() + "
wrote " + a.getBooks().stream().map(b -> b.getTitle()).collect(Collectors.joining(", ")));
}
www.thoughts-on-java.org
FetchJoin
Demo (Projekt LazyLoading)
www.thoughts-on-java.org
• Vorteile:
• EntityManager lädt Relation in der selben Abfrage
• Nachteile:
• Spezielle Abfrage für jeden Use Case erforderlich
• Bildet kartesisches Produkt
www.thoughts-on-java.org
FetchJoin
• Neu in JPA 2.1
• Definiert einen zu ladenden Entitätsgraphen
• @NamedEntityGraph
• @NamedAttributeNode
• @NamedSubGraph
www.thoughts-on-java.org
NamedEntityGraph
• Fetchgraph
• Elemente des Graphen werden EAGER geladen
• Alle anderen werden LAZY geladen
• Loadgraph
• Elemente des Graphen werden EAGER geladen
• Alle anderen werden mit ihrem jeweiligen FetchType geladen
• ACHTUNG: Hibernate behandelt beides gleich!
• HHH-8776
www.thoughts-on-java.org
NamedEntityGraph
Demo (Projekt LazyLoading)
www.thoughts-on-java.org
• Vorteile:
• Queryspezifisches EAGER-loading
• Definition des Graphen unabhängig von der Abfrage
• Nachteile:
• Bildet kartesisches Produkt
www.thoughts-on-java.org
NamedEntityGraph
• Neu in JPA 2.1
• Dynamische Variante des @NamedEntityGraph
• Definition mittels Java API
• EntityManager.createEntityGraph(Class entity)
• EntityGraph
• SubGraph
www.thoughts-on-java.org
EntityGraph
Demo (Projekt LazyLoading)
www.thoughts-on-java.org
• Vorteile:
• Queryspezifisches EAGER-loading
• Definition des Graphen unabhängig von der Abfrage
• Graph kann zur Laufzeit definiert werden
• Nachteile:
• Bildet kartesisches Produkt
www.thoughts-on-java.org
EntityGraph
3. Caching
www.thoughts-on-java.org
www.thoughts-on-java.org
DB
2nd
Level
Cache
1st
Level
Cache
Hibernate
Session
Query
Cache
1st
Level
Cache
Hibernate
Session
Caches
• 1st Level Cache
• An Session gebunden
• Per default aktiviert
• 2nd Level Cache
• Sessionübergreifend
• Konfiguration erforderlich
• Query Cache
• Sessionübergreifend
• Konfiguration erforderlich
www.thoughts-on-java.org
Caches
3.1 1st Level Cache
www.thoughts-on-java.org
• Automatisch aktiviert
• Sessioninterner Speicher verwendeter Entities
• Zugriff erfolgt transparent
www.thoughts-on-java.org
1stLevelCache
Demo (Projekt 1stLevelCaching)
www.thoughts-on-java.org
3.2 2nd Level Cache
www.thoughts-on-java.org
• Sessionübergreifender Speicher für Entities
• Im default deaktiviert
• persistence.xml oder EntityManagerFactory
• Zugriff erfolgt transparent
• Muss nicht durch den Persistence Provider bereitgestellt werden
• u.U. nicht portierbar
www.thoughts-on-java.org
2ndLevelCache
• Shared Cache Mode
• ALL alle Entities werden gecached
• NONE keine Entities werden gecached
• ENABLE_SELECTIVE Caching muss für Entities aktiviert werden
• DISABLE_SELECTIVE Caching kann für Entities deaktiviert werden
• UNSPECIFIED Verwendet das default caching des
PersistenceProviders
www.thoughts-on-java.org
2ndLevelCache
• Speichert die Entities in ‚dehydrated‘-Form
• Nur die Eigenschaften der Entity, nicht die Entity selbst
• 1  [„Joshua“, „Bloch“, 0]
• Relationen werden nicht mit gespeichert
• Caching mit @org.hibernate.annotations.Cache möglich
www.thoughts-on-java.org
2ndLevelCache
Demo (Projekt 2ndLevelCaching)
www.thoughts-on-java.org
• Verwendung des Cache konfigurieren
• Cache Retrieve Mode
• Definiert wie Daten aus dem Cache gelesen werden
• Cache Store Mode
• Definiert wie Daten in den Cache geschrieben werden
www.thoughts-on-java.org
2ndLevelCache
• Cache Retrieve Mode
• CacheRetrieveMode.USE (default)
• Daten werden aus Cache gelesen
• CacheRetrieveMode.BYPASS
• Daten werden aus DB gelesen
www.thoughts-on-java.org
2ndLevelCache
• Cache Store Mode
• CacheStoreMode.USE (default)
• Cache wird beim commit erzeugt oder aktualisiert
• Aktualisierung wird bei nur lesendem Zugriff nicht erzwungen
• CacheStoreMode.BYPASS
• Cache wird nur aktualisiert, nicht angelegt
• CacheStoreMode.REFRESH
• Cache wird beim commit erzeugt oder aktualisiert
• Aktualisierung wird bei nur lesendem Zugriff erzwungen
www.thoughts-on-java.org
2ndLevelCache
Demo (Projekt 2ndLevelCaching)
www.thoughts-on-java.org
• Concurrency Strategy
• JPA: Definition erfolgt global
• Hibernate: Definition erfolgt spezifisch für jede Entity
• @org.hibernate.annotations.Cache
www.thoughts-on-java.org
2ndLevelCache
• Concurrency Strategy
• Read-only
• Read-write
• Nicht für serializable transaction isolation verwendbar
• Nonstrict-read-write
• Keine strict transaction isolation
• Transactional
• Benötigt JTA
• Z.B. Infinispan, EHCache
www.thoughts-on-java.org
2ndLevelCache
3.3 Query Cache
www.thoughts-on-java.org
• Hibernate spezifisch
• Sessionübergreifender Speicher von Abfrageergebnissen
• Im default deaktiviert
• persistence.xml: hibernate.cache.use_query_cache = true
• Caching muss für Query aktiviert werden
• org.hibernate.Query.setCacheable(true)
• @NamedQuery(… hints =
@QueryHint(name="org.hibernate.cacheable", value="true"))
www.thoughts-on-java.org
QueryCache
• Speichert Ergebnis für Abfrage mit Parametern
• [„FROM Author WHERE id=?“, 1]  [1]
• Speichert nur Referenzen auf Entitäten oder Skalare
• Immer mit 2nd Level Cache kombinieren
www.thoughts-on-java.org
QueryCache
Demo (Projekt QueryCaching)
www.thoughts-on-java.org
• Nur Daten mit geringer Änderungsrate cachen
• Cache nicht ohne Benchmark einführen
• Query Cache und 2nd Level Cache gemeinsam nutzen
• Konfigurationen aufeinander abstimmen
www.thoughts-on-java.org
Empfehlung
• JSR 338: JavaTM Persistence API, Version 2.1
http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-
spec/index.html
• Hibernate Reference Documentation
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/
• Hibernate Developer Guide
http://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/
• Hibernate ORM: Tips, Tricks and Performance Techniques by Brett
Meyer http://de.slideshare.net/brmeyer/hibernate-orm-
performance-31550150
• Java Persistence with Hibernate Second Edition by Christian Bauer,
Gaving King, Gary Gregory
www.thoughts-on-java.org
Quellen
• Java Platform, Enterprise Edition: The Java EE Tutorial
https://docs.oracle.com/javaee/7/tutorial/index.html
• Hibernate: Truly Understanding the Second-Level and Query Caches
http://www.javalobby.org/java/forums/t48846.html
www.thoughts-on-java.org
Quellen
Noch Fragen?
www.thoughts-on-java.org

Contenu connexe

En vedette

High Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootHigh Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootDaniel Woods
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Ryan Cuprak
 
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 201450 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014Ryan Cuprak
 
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...AWS Germany
 
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)SEO & UX München
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenLenz Grimmer
 
20091020 JPA2
20091020 JPA220091020 JPA2
20091020 JPA2lyonjug
 

En vedette (9)

High Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring BootHigh Performance Microservices with Ratpack and Spring Boot
High Performance Microservices with Ratpack and Spring Boot
 
Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]Top 50 java ee 7 best practices [con5669]
Top 50 java ee 7 best practices [con5669]
 
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 201450 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
50 EJB 3 Best Practices in 50 Minutes - JavaOne 2014
 
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
 
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)
Pagespeed Learnings aus mehreren Relaunches (SEO Campixx 2017)
 
album de fotografias
album de fotografiasalbum de fotografias
album de fotografias
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
 
20091020 JPA2
20091020 JPA220091020 JPA2
20091020 JPA2
 
Jpa(1)
Jpa(1)Jpa(1)
Jpa(1)
 

Similaire à Effiziente datenpersistierung mit JPA 2.1 und Hibernate

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Daniel Havlik
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)Michael Kurz
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAsQAware GmbH
 
Bi testing media_factory_0.10
Bi testing media_factory_0.10Bi testing media_factory_0.10
Bi testing media_factory_0.10inovex GmbH
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit MavenStefan Scheidt
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtOPITZ CONSULTING Deutschland
 
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
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance ReloadedGregor Goldbach
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro sessionVirttoo org
 
Einführung in Elasticsearch - August 2014
Einführung in Elasticsearch - August 2014Einführung in Elasticsearch - August 2014
Einführung in Elasticsearch - August 2014inovex GmbH
 
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in RubyPerformanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in Rubyvesparun
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"schellsoft
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeos890
 
ColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep DiveColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep DiveBokowsky + Laymann GmbH
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
HTML5 Offline - Fallstricke für mobile Webseiten und WebApps
HTML5 Offline - Fallstricke für mobile Webseiten und WebAppsHTML5 Offline - Fallstricke für mobile Webseiten und WebApps
HTML5 Offline - Fallstricke für mobile Webseiten und WebAppsUlrich Schmidt
 

Similaire à Effiziente datenpersistierung mit JPA 2.1 und Hibernate (20)

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Query Result Caching
Query Result CachingQuery Result Caching
Query Result Caching
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Bi testing media_factory_0.10
Bi testing media_factory_0.10Bi testing media_factory_0.10
Bi testing media_factory_0.10
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit Maven
 
XPages: Performance-Optimierung - Ulrich Krause (eknori) SNoUG 2013
XPages: Performance-Optimierung  - Ulrich Krause (eknori) SNoUG 2013XPages: Performance-Optimierung  - Ulrich Krause (eknori) SNoUG 2013
XPages: Performance-Optimierung - Ulrich Krause (eknori) SNoUG 2013
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro session
 
Einführung in Elasticsearch - August 2014
Einführung in Elasticsearch - August 2014Einführung in Elasticsearch - August 2014
Einführung in Elasticsearch - August 2014
 
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in RubyPerformanter, hochskalierbarer Web 2.0-Dienst in Ruby
Performanter, hochskalierbarer Web 2.0-Dienst in Ruby
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
 
ColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep DiveColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep Dive
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
HTML5 Offline - Fallstricke für mobile Webseiten und WebApps
HTML5 Offline - Fallstricke für mobile Webseiten und WebAppsHTML5 Offline - Fallstricke für mobile Webseiten und WebApps
HTML5 Offline - Fallstricke für mobile Webseiten und WebApps
 

Effiziente datenpersistierung mit JPA 2.1 und Hibernate