Inhalt | 5 |
Geleitwort zur zweiten Auflage | 13 |
Geleitwort | 15 |
Vorwort zur zweiten Auflage | 17 |
Vorwort | 19 |
Danksagungen | 21 |
Über dieses Buch | 23 |
Roadmap | 23 |
Für wen ist dieses Buch gedacht? | 24 |
Code-Konventionen | 25 |
Download des Quellcodes | 25 |
Über die Autoren | 25 |
Author Online | 26 |
Teil 1 Erste Schritte mit Hibernate und EJB 3.0 | 27 |
1 Objekt-relationale Persistenz | 29 |
1.1 Was ist Persistenz? | 31 |
1.1.1 Relationale Datenbanken | 31 |
1.1.2 Die Grundlagen von SQL | 32 |
1.1.3 SQL in Java nutzen | 33 |
1.1.4 Persistenz in objektorientierten Applikationen | 33 |
1.2 Die Unvereinbarkeit der Paradigmen | 35 |
1.2.1 Das Problem der Granularität | 37 |
1.2.2 Das Problem der Subtypen | 38 |
1.2.3 Das Problem der Identität | 40 |
1.2.4 Mit Assoziationen verbundene Probleme | 41 |
1.2.5 Das Problem der Datennavigation | 43 |
1.2.6 Die Kosten der Unvereinbarkeit der Paradigmen | 44 |
1.3 Persistenzschichten und Alternativen | 45 |
1.3.1 Schichtarchitektur | 45 |
1.3.2 Eine Persistenzschicht mit SQL/JDBC handcodieren | 46 |
1.3.3 Serialisierung | 47 |
1.3.4 Objektorientierte Datenbanksysteme | 48 |
1.3.5 Andere Optionen | 49 |
1.4 Objekt-relationales Mapping | 49 |
1.4.1 Was ist ORM? | 50 |
1.4.2 Generische ORM-Probleme | 52 |
1.4.3 Warum ORM? | 53 |
1.4.4 Hibernate, EJB3 und JPA | 55 |
1.5 Zusammenfassung | 60 |
2 Ein neues Projekt beginnen | 61 |
2.1 Ein Hibernate-Projekt beginnen | 62 |
2.1.1 Auswahl eines Entwicklungsprozesses | 62 |
2.1.2 Das Projekt aufsetzen | 65 |
2.1.3 Konfiguration und Start von Hibernate | 71 |
2.1.4 Starten und Testen der Applikation | 81 |
2.2 Ein neues Projekt mit Java Persistence | 88 |
2.2.1 Die Arbeit mit Hibernate Annotations | 88 |
2.2.2 Die Arbeit mit Hibernate EntityManager | 91 |
2.2.3 Die Komponenten von EJB | 97 |
2.2.4 Wechsel zu Hibernate-Interfaces | 103 |
2.3 Reverse Engineering einer Legacy-Datenbank | 105 |
2.3.1 Erstellen einer Datenbankkonfiguration | 106 |
2.3.2 Reverse Engineering anpassen | 107 |
2.3.3 Generieren von Java-Quellcode | 108 |
2.4 Integration mit Java EE-Diensten | 112 |
2.4.1 Integration mit JTA | 112 |
2.4.2 JNDI-gebundene SessionFactory | 116 |
2.4.3 Bereitstellung von JMX-Diensten | 118 |
2.5 Zusammenfassung | 119 |
3 Domain-Modelle und Metadaten | 121 |
3.1 Die Applikation CaveatEmptor | 122 |
3.1.1 Analyse der Business-Domain | 122 |
3.1.2 Das Domain-Modell für CaveatEmptor | 123 |
3.2 Implementierung des Domain-Modells | 126 |
3.2.1 Das Vermischen von Aufgabenbereichen | 126 |
3.2.2 Transparente und automatische Persistenz | 127 |
3.2.3 POJOs und persistente Entity-Klassen | 129 |
3.2.4 Implementierung von POJO- Assoziationen | 131 |
3.2.5 Logik in Zugriffs-Methoden einfügen | 135 |
3.3 Objekt-relationale Mapping-Metadaten | 137 |
3.3.1 Metadaten in XML | 137 |
3.3.2 Auf Annotationen basierende Metadaten | 139 |
3.3.3 Die Arbeit mit XDoclet | 145 |
3.3.4 Umgang mit globalen Metadaten | 146 |
3.3.5 Die Manipulation von Metadaten zur Laufzeit | 151 |
3.4 Alternative Entity- Repräsentation | 153 |
3.4.1 Erstellung von dynamischen Applikationen | 154 |
3.4.2 Daten in XML repräsentieren | 160 |
3.5 Zusammenfassung | 163 |
Teil 2 Konzepte und Strategien für das Mapping | 165 |
4 Mapping von Persistenzklassen | 167 |
4.1 Entities- und Wert-Typen | 167 |
4.1.1 Feingranulierte Domain-Modelle | 168 |
4.1.2 Konzeptdefinition | 168 |
4.1.3 Identifizierung von Entities und Wert-Typen | 169 |
4.2 Entities mit Identität mappen | 171 |
4.2.1 Identität und Gleichheit bei Java | 171 |
4.2.2 Umgang mit Datenbankidentität | 172 |
4.2.3 Primärschlüssel für Datenbanken | 174 |
4.3 Optionen für das Mapping von Klassen | 179 |
4.3.1 Dynamische SQL-Generierung | 179 |
4.3.2 Eine Entity unveränderlich machen | 180 |
4.3.3 Bezeichnung von Entities für Abfragen | 181 |
4.3.4 Deklaration eines Paketnamens | 182 |
4.3.5 Quoting von SQL-Identifikatoren | 182 |
4.3.6 Implementierung von Namenskonventionen | 183 |
4.4 Feingranulierte Modelle und Mappings | 185 |
4.4.1 Mapping von grundlegenden Eigenschaften | 185 |
4.4.2 Mapping von Komponenten | 191 |
4.5 Zusammenfassung | 196 |
5 Vererbung und selbst erstellte Typen | 197 |
5.1 Mapping von Klassenvererbung | 197 |
5.1.1 Tabelle pro konkrete Klasse mit implizitem Polymorphismus | 198 |
5.1.2 Tabelle pro konkrete Klasse mit Unions | 201 |
5.1.3 Tabelle pro Klassenhierarchie | 203 |
5.1.4 Tabelle pro Subklasse | 207 |
5.1.5 Mischen von Vererbungsstrategien | 210 |
5.1.6 Wahl einer Strategie | 212 |
5.2 Das Typsystem von Hibernate | 214 |
5.2.1 Wiederholung von Entity- und Wert-Typen | 214 |
5.2.2 Eingebaute Mapping-Typen | 216 |
5.2.3 Die Arbeit mit Mapping-Typen | 220 |
5.3 Erstellen eigener Mapping-Typen | 222 |
5.3.1 Überlegungen zu eigenen Mapping-Typen | 222 |
5.3.2 Die Extension Points | 223 |
5.3.3 Über eigene Mapping-Typen | 224 |
5.3.4 Erstellen eines UserType | 225 |
5.3.5 Erstellen eines CompositeUserType | 228 |
5.3.6 Parametrisierung eigener Typen | 231 |
5.3.7 Mapping von Aufzählungen | 233 |
5.4 Zusammenfassung | 237 |
6 Mapping von Collections und Entity-Assoziationen | 239 |
6.1 Sets, Multimengen, Listen und Maps mit Wert-Typen | 239 |
6.1.1 Wahl eines Collection-Interfaces | 240 |
6.1.2 Mapping eines Set | 242 |
6.1.3 Mapping einer Identifikator-Multimenge | 243 |
6.1.4 Mapping einer Liste | 244 |
6.1.5 Mapping einer Map | 245 |
6.1.6 Sortierte und geordnete Collections | 246 |
6.2 Collections von Komponenten | 248 |
6.2.1 Schreiben der Komponentenklasse | 249 |
6.2.2 Mapping der Collection | 249 |
6.2.3 Aktivieren der bidirektionalen Navigation | 250 |
6.2.4 Vermeiden von not-null-Spalten | 250 |
6.3 Mapping von Collections mit Annotationen | 252 |
6.3.1 Grundlegendes Mapping von Collections | 252 |
6.3.2 Sortierte und geordnete Collections | 254 |
6.3.3 Eine Collection von eingebetteten Objekten mappen | 254 |
6.4 Mapping einer Parent/Children-Beziehung | 256 |
6.4.1 Kardinalität | 257 |
6.4.2 Die einfachste mögliche Assoziation | 257 |
6.4.3 Die Assoziation bidirektional machen | 259 |
6.4.4 Kaskadierung des Objektzustands | 262 |
6.5 Zusammenfassung | 269 |
7 Fortgeschrittene Mappings für Entity-Assoziationen | 271 |
7.1 Entity- Assoziationen mit einem Wert | 272 |
7.1.1 Gemeinsame Primärschlüssel- Assoziationen | 273 |
7.1.2 one-to-one-Fremdschlüssel- Assoziationen | 276 |
7.1.3 Mapping mit einer Join-Tabelle | 278 |
7.2 Mehrwertige Entity- Assoziationen | 282 |
7.2.1 one-to-many- Assoziationen | 283 |
7.2.2 many-to-many- Assoziationen | 289 |
7.2.3 Zusätzliche Spalten bei Join-Tabellen | 294 |
7.2.4 Mapping von Maps | 299 |
7.3 Polymorphe Assoziationen | 302 |
7.3.1 Polymorphe many-to-one- Assoziationen | 302 |
7.3.2 Polymorphe Collections | 304 |
7.3.3 Polymorphe Assoziationen mit Unions | 305 |
7.3.4 Polymorphe Tabelle pro konkrete Klasse | 307 |
7.4 Zusammenfassung | 309 |
8 Legacy-Datenbanken und eigenes SQL | 311 |
8.1 Integration von Datenbanken aus Altsystemen | 312 |
8.1.1 Umgang mit Primärschlüsseln | 313 |
8.1.2 Beliebige Join-Bedingungen mit Formeln | 323 |
8.1.3 Zusammenführen beliebiger Tabellen | 328 |
8.1.4 Die Arbeit mit Triggern | 331 |
8.2 Anpassung von SQL | 335 |
8.2.1 Eigene CRUD- Anweisungen schreiben | 336 |
8.2.2 Integration von Stored Procedures und Functions | 340 |
8.3 Verbesserung der Schema-DDL | 347 |
8.3.1 Eigene Namen und Datentypen in SQL | 347 |
8.3.2 Gewährleistung von Datenkonsistenz | 349 |
8.3.3 Einfügen von Domain- und Spalten-Constraints | 351 |
8.3.4 Constraints auf Tabellenebene | 352 |
8.3.5 Datenbank-Constraints | 355 |
8.3.6 Erstellung von Indizes | 356 |
8.3.7 Einfügen zusätzlicher DDL | 357 |
8.4 Zusammenfassung | 359 |
Teil 3 Dialogorientierte Objektverarbeitung | 361 |
9 Die Arbeit mit Objekten | 363 |
9.1 Der Persistenz-Lebenszyklus | 364 |
9.1.1 Objekt-Zustände | 364 |
9.1.2 Der Persistenzkontext | 367 |
9.2 Objektidentität und Objektgleichheit | 370 |
9.2.1 Die Konversationen | 371 |
9.2.2 Der Geltungsbereich der Objektidentität | 372 |
9.2.3 Die Identität von detached Objekten | 373 |
9.2.4 Erweiterung eines Persistenzkontexts | 379 |
9.3 Die Hibernate-Interfaces | 379 |
9.3.1 Speichern und Laden von Objekten | 380 |
9.3.2 Die Arbeit mit detached Objekten | 386 |
9.3.3 Management des Persistenzkontexts | 391 |
9.4 Die Java Persistence API | 394 |
9.4.1 Speichern und Laden von Objekten | 394 |
9.4.2 Die Arbeit mit detached Entity-Instanzen | 399 |
9.5 Java Persistence in EBJ-Komponenten | 402 |
9.5.1 EntityManager injizieren | 403 |
9.5.2 Lookup eines EntityManagers | 405 |
9.5.3 Zugriff auf eine EntityManagerFactory | 405 |
9.6 Zusammenfassung | 407 |
10 Transaktionen und gleichzeitiger Datenzugriff | 409 |
10.1 Einführung in Transaktionen | 409 |
10.1.1 Datenbank und Systemtransaktionen | 411 |
10.1.2 Transaktionen in einer Hibernate- Applikation | 413 |
10.1.3 Transaktionen mit Java Persistence | 423 |
10.2 Steuerung des zeitgleichen Zugriffs | 426 |
10.2.1 Zeitgleicher Zugriff auf Datenbanklevel | 427 |
10.2.2 Optimistische Steuerung des zeitgleichen Zugriffs | 432 |
10.2.3 Zusätzliche Isolationsgarantien | 438 |
10.3 Nicht-transaktionaler Datenzugriff | 442 |
10.3.1 Entlarvte Mythen über Autocommit | 442 |
10.3.2 Die nicht-transaktionale Arbeit mit Hibernate | 444 |
10.3.3 Optionale Transaktionen mit JTA | 445 |
10.4 Zusammenfassung | 447 |
11 Konversationen implementieren | 449 |
11.1 Propagation der Hibernate-Session | 450 |
11.1.1 Der Anwendungsfall für die Session-Propagation | 450 |
11.1.2 Thread-local-Propagation | 452 |
11.1.3 Propagation mit JTA | 453 |
11.1.4 Propagation mit EJBs | 455 |
11.2 Konversationen mit Hibernate | 456 |
11.2.1 Die Garantien einer Konversation | 456 |
11.2.2 Konversationen mit detached Objekten | 457 |
11.2.3 Erweitern einer Session für eine Konversation | 460 |
11.3 Konversationen mit JPA | 466 |
11.3.1 Kontextpropagation in Java SE | 467 |
11.3.2 Merging von detached Objekten in Konversationen | 469 |
11.3.3 Erweiterung des Persistenzkontexts in Java SE | 470 |
11.4 Konversationen mit EJB 3.0 | 474 |
11.4.1 Kontextpropagation mit EJBs | 474 |
11.4.2 Erweiterter Persistenzkontext mit EJBs | 477 |
11.5 Zusammenfassung | 482 |
12 Effiziente Bearbeitung von Objekten | 485 |
12.1 Transitive Persistenz | 486 |
12.1.1 Persistence by Reachability | 486 |
12.1.2 Kaskadierung auf Assoziationen anwenden | 487 |
12.1.3 Die Arbeit mit dem transitiven Zustand | 491 |
12.1.4 Transitive Assoziationen mit JPA | 497 |
12.2 Bulk- und Batch-Operationen | 499 |
12.2.1 Bulk- Anweisungen mit HQL und JPA QL | 499 |
12.2.2 Batch-Verarbeitung | 502 |
12.2.3 Die Arbeit mit einer stateless Session | 504 |
12.3 Datenfilterung und Interception | 506 |
12.3.1 Dynamische Datenfilter | 507 |
12.3.2 Abfangen von Events in Hibernate | 511 |
12.3.3 Das Core-Event-System | 517 |
12.3.4 Entity-Listener und Callbacks | 519 |
12.4 Zusammenfassung | 521 |
13 Fetching und Caching optimieren | 523 |
13.1 Definition des globalen Fetch-Plans | 523 |
13.1.1 Optionen für das Auslesen der Objekte | 523 |
13.1.2 Der Fetch-Plan: Default und Lazy | 527 |
13.1.3 Die Arbeit mit Proxies | 527 |
13.1.4 Deaktivieren der Proxy-Generierung | 530 |
13.1.5 Eager Loading von Assoziationen und Collections | 531 |
13.1.6 Lazy Loading mit Interception | 533 |
13.2 Wahl einer Fetching-Strategie | 535 |
13.2.1 Prefetching von Daten in Batches | 536 |
13.2.2 Collections mit Subselects prefetchen | 539 |
13.2.3 Eager Fetching mit Joins | 540 |
13.2.4 Optimieren des Fetchings für Sekundärtabellen | 542 |
13.2.5 Leitfaden zur Optimierung | 545 |
13.3 Grundlagen des Caching | 552 |
13.3.1 Geltungsbereiche und Strategien für das Caching | 553 |
13.3.2 Die Cache- Architektur von Hibernate | 557 |
13.4 Caching in der Praxis | 561 |
13.4.1 Wahl einer Strategie für die Concurrency-Steuerung | 561 |
13.4.2 Die Arbeit mit Cache-Bereichen | 563 |
13.4.3 Einrichten eines lokalen Cache-Providers | 564 |
13.4.4 Einrichten eines replizierten Caches | 565 |
13.4.5 Steuerung des Second-level-Caches | 569 |
13.5 Zusammenfassung | 571 |
14 Abfragen mit HQL und JPA QL | 573 |
14.1 Erstellen und Starten und Abfragen | 574 |
14.1.1 Vorbereiten einer Abfrage | 574 |
14.1.2 Ausführen einer Abfrage | 583 |
14.1.3 Die Arbeit mit benannten Abfragen | 587 |
14.2 HQL- und JPA QL- Abfragen | 590 |
14.2.1 Selektion | 590 |
14.2.2 Restriktion | 592 |
14.2.3 Projektion | 597 |
14.3 Joins, Reporting-Abfragen und Subselects | 599 |
14.3.1 Zusammenführen von Relationen und Assoziationen | 600 |
14.3.2 Reporting- Abfragen | 610 |
14.3.3 Die Arbeit mit Subselects | 615 |
14.4 Zusammenfassung | 617 |
15 Fortgeschrittene Abfrageoptionen | 619 |
15.1 Abfragen mit Criteria und Example | 620 |
15.1.1 Grundlegende Abfragen mit Kriterien | 620 |
15.1.2 Joins und dynamisches Fetching | 625 |
15.1.3 Projektion und Berichtsabfragen | 630 |
15.1.4 Query by Example | 633 |
15.2 Native SQL- Abfragen | 636 |
15.2.1 AutomatischerUmgang mit dem Resultset | 636 |
15.2.2 Auslesen skalarer Werte | 637 |
15.2.3 Natives SQL in Java Persistence | 639 |
15.3 Filtern von Collections | 641 |
15.4 Caching der Abfrageergebnisse | 643 |
15.4.1 Aktivieren des Caches für das Abfrageergebnis | 644 |
15.4.2 Funktionsweise des Abfrage-Caches | 644 |
15.4.3 Wann sollte der Abfrage-Cache benutzt werden? | 645 |
15.4.4 Cache-Lookups von natürlichen Identifikatoren | 646 |
15.5 Zusammenfassung | 648 |
16.1 Hibernate in einer Webapplikation | 650 |
16.1.1 Der Use Case für eine mehrschichtige Applikation | 650 |
16.1.2 Einen Controller schreiben | 650 |
16.1.3 Das Entwurfsmuster Open Session in View | 652 |
16.1.4 Design von smarten Domain-Modellen | 656 |
16.2 Eine Persistenzschicht erstellen | 658 |
16.2.1 Ein generisches Muster für das Data Access Object | 659 |
16.2.2 Das generische CRUD-Interface implementieren | 661 |
16.2.3 Implementierung von Entity-DAOs | 663 |
16.2.4 Die Verwendung von Data Access Objects | 664 |
16.3 Das Command-Muster | 668 |
16.3.1 Die grundlegenden Interfaces | 668 |
16.3.2 Ausführung von Command-Objekten | 670 |
16.3.3 Varianten des Command-Musters | 672 |
16.4 Das Design einer Applikation mit EJB 3.0 | 674 |
16.4.1 Mit stateful Beans eine Konversation implementieren | 674 |
16.4.2 DAOs mit EJBs schreiben | 676 |
16.4.3 Einsatz der Abhängigkeitsinjektion | 677 |
16.5 Testen | 679 |
16.5.1 Die verschiedenen Testarten | 679 |
16.5.2 Die Arbeit mit TestNG | 680 |
16.5.3 Die Persistenzschicht testen | 684 |
16.5.4 Ein paar Überlegungen zu Performance-Benchmarks | 691 |
16.6 Zusammenfassung | 693 |
Anhang A: SQL-Grundbegriffe | 695 |
Anhang B: Mapping-Schnellreferenz | 699 |
Quellenangaben | 701 |
Register | 703 |