Inhaltsverzeichnis | 6 |
Vorwort | 14 |
Kapitel 1 Einleitung | 16 |
1.1 Für wen ist dieses Buch? | 16 |
1.2 Organisation des Buches | 17 |
1.3 Web-Site zum Buch | 18 |
Kapitel 2 Überblick und Installation | 20 |
2.1 Management Summary | 20 |
2.1.1 Was ist Spring? | 20 |
2.1.2 Was ist Hibernate? | 21 |
2.1.3 Kombination von Spring und Hibernate | 21 |
2.2 Installation | 22 |
2.2.1 Download von Spring | 23 |
2.2.2 Download von Hibernate | 24 |
2.2.3 Ein IDE-Projekt mit Hibernate einrichten | 25 |
2.2.4 Ein Spring-Projekt | 26 |
Kapitel 3 Software-Architektur der Beispielanwendung | 28 |
3.1 Opiz – Online-Pizza-Dienst | 28 |
3.1.1 Fachliche Use-Cases | 28 |
3.1.2 Domain-Modell | 30 |
3.1.3 Organisation in Eclipse | 32 |
3.2 Architektur-Überblick | 32 |
3.2.1 High-Level-Architektur | 32 |
3.2.2 Data-Access-Objekt-Schicht | 34 |
3.2.3 Service-Schicht | 35 |
3.2.4 Präsentationsschicht bei Web-Anwendungen | 36 |
Kapitel 4 Einführung in Hibernate | 38 |
4.1 Hibernate als O/R-Mapper | 38 |
4.2 Überblick über die Hibernate-Architektur | 40 |
4.2.1 Persistente Klassen | 40 |
4.2.2 Die Hibernate-Session | 41 |
4.2.3 Hibernate-Session-Factory | 41 |
4.2.4 Hibernate-Mapping | 42 |
4.3 Hibernate in der Praxis | 43 |
4.3.1 Mapping mit Annotations | 44 |
4.3.2 Konfiguration der Session-Factory | 46 |
4.3.3 Verzeichnisstruktur | 48 |
4.3.4 Initialisierung der Session-Factory | 48 |
4.3.5 Speichern eines Objekts | 49 |
4.3.6 Laden eines Objekts | 52 |
4.3.7 Suchen eines Objekts | 53 |
4.3.8 Verändern eines Objekts | 55 |
4.3.9 L öschen eines Objekts | 56 |
4.3.10 Exception-Handling | 56 |
4.3.11 Logging | 56 |
4.4 Persistency-Lifecycle | 58 |
Kapitel 5 O/R-Mapping mit Hibernate | 60 |
5.1 Mapping von persistenten Klassen | 61 |
5.2 Mapping von einfachen Properties | 61 |
5.2.1 Persistente Properties | 61 |
5.2.2 Spalteneigenschaften festlegen | 62 |
5.2.3 Enumerations | 63 |
5.2.4 Zeitbasierte Properties | 64 |
5.2.5 Blobs und Clobs | 64 |
5.3 Mapping von Identifier-Properties | 65 |
5.3.1 Manuell vergebene Schlüssel | 65 |
5.3.2 Automatisch generierte Schl ¨ussel | 66 |
5.3.3 Natürliche Schlüssel | 68 |
5.4 Mapping von Beziehungen | 69 |
5.4.1 1:N-Beziehungen | 69 |
5.4.2 Bags, Lists, Arrays, Sets, Collections und Maps | 77 |
5.4.3 Equals und HashCode implementieren | 79 |
5.4.4 M:N-Beziehungen | 81 |
5.4.5 1:1-Beziehungen | 84 |
5.4.6 Unidirektionale Beziehungen rückwärts navigieren | 89 |
5.4.7 Lazy Loading | 90 |
5.5 Mapping von Vererbung | 92 |
5.5.1 Eine Tabelle für die ganze Klassenhierarchie | 93 |
5.5.2 Eine Tabelle pro Klasse | 96 |
5.5.3 Eine Tabelle pro konkreter Subklasse | 97 |
5.5.4 Polymorphe Beziehungen | 97 |
5.6 Mapping mit XML | 98 |
5.7 Weitere Mapping-Elemente | 99 |
Kapitel 6 Einführung in Spring | 100 |
6.1 Grundlagen | 100 |
6.1.1 Lightweight-Container | 100 |
6.1.2 Inversion of Control | 101 |
6.1.3 Dependency-Injection | 102 |
6.2 Überblick und Einstieg in Spring | 104 |
6.2.1 Übersicht über die Spring-Module | 104 |
6.2.2 Erstellung eines Spring-Projekts | 107 |
6.2.3 Konfiguration des Application-Contexts | 110 |
6.3 Spring-Beans und ihre Definitionen | 111 |
6.3.1 Erzeugung einer Spring-Bean | 111 |
6.3.2 Properties und Abhängigkeiten von Spring-Beans | 113 |
6.3.3 Collections und andere Util-Klassen | 119 |
6.3.4 Der Life-Cycle von Spring-Beans | 122 |
6.4 Spring Inversion-of-Control-Container | 124 |
6.4.1 Die Bean-Factory-Schnittstelle | 124 |
6.4.2 Weitergehende Funktionalität mit demApplication-Context | 125 |
6.5 Individualisieren des Containers | 127 |
6.5.1 Veränderung von Bean-Definitionen | 127 |
6.5.2 Nachbearbeitung von Beans | 129 |
6.5.3 Definition individueller Property-Editors | 131 |
Kapitel 7 Die Datenzugriffsschicht | 134 |
7.1 Vorteile von Spring im Kontext einesO/R-Mappers | 135 |
7.2 Hibernate-Konfiguration mit Spring | 136 |
7.2.1 Definition der JDBC-DataSource | 136 |
7.2.2 Definition der Hibernate-SessionFactory | 137 |
7.3 Abfragen mit einem Data-Access-Objekt | 139 |
7.3.1 Objekte mit dem Primärschlüssel laden | 139 |
7.3.2 Konfiguration der DAO-Klasse als Spring-Bean | 140 |
7.3.3 Eine DAO-Finder-Methode | 140 |
7.4 Test der DAO-Klassen | 142 |
7.4.1 Das Spring-Test-Framework | 142 |
7.4.2 Test einer DAO-Abfrage-Methode | 144 |
7.4.3 Weitere Methoden in der Spring-Test-Klassenhierarchie | 147 |
7.4.4 Initialisierung der Test-Klasse | 148 |
7.4.5 Autowire by Name | 148 |
7.5 Weitere Features der Hibernate Query Language | 149 |
7.5.1 Die select-Klausel | 149 |
7.5.2 Funktionen | 150 |
7.5.3 Die from-Klausel | 151 |
7.5.4 Die where-Klausel | 152 |
7.5.5 Subquery | 152 |
7.5.6 Gruppierung | 153 |
7.6 Zusätzliche Hibernate-Zugriffsmöglichkeiten | 153 |
7.6.1 Weitere Methoden in HibernateTemplate | 153 |
7.6.2 Die HibernateCallback-Klasse | 156 |
7.6.3 Eine Paged-Abfrage | 156 |
7.6.4 DAO-Implementierung ohne HibernateDaoSupport | 158 |
7.6.5 DAO-Implementierung ohne Spring | 158 |
7.7 Die Criteria-API | 160 |
7.7.1 Ein Criteria-basiertes Beispiel | 160 |
7.7.2 Test einer Criteria-basierten Methode | 161 |
7.7.3 Query-by-Example | 161 |
7.7.4 Aggregat-Funktionen | 163 |
7.8 DAO-Schreibmethoden | 164 |
7.8.1 Neue Objekte speichern | 164 |
7.8.2 Aktualisieren eines persistenten Objekts | 165 |
7.8.3 Aktualisieren eines detachten Objekts | 165 |
7.8.4 Das Flush-Problem in Tests | 166 |
7.9 Arbeiten mit Stored Procedures | 168 |
7.9.1 Aufruf über JDBC | 168 |
7.9.2 Aufruf über Spring | 169 |
7.9.3 Aufruf über Hibernate | 170 |
7.9.4 Empfehlung | 171 |
Kapitel 8 Services mit Spring | 172 |
8.1 Allgemeine Themen bei der Implementierungder Service-Schicht | 172 |
8.2 Der Use-Case ”Pizza-Bestellung“ | 175 |
8.2.1 Implementierung einer Service-Methode | 175 |
8.2.2 Test der Service-Methode | 177 |
8.3 Aufnehmen einer weiterenin einer Bestellung | 178 |
8.3.1 Testen mit Mock-Objekten | 179 |
8.4 Spring AOP – einfach und mächtig | 182 |
8.4.1 Konzept des Aspect-Oriented Programming | 182 |
8.4.2 Spring-AOP: Annotations und XML | 184 |
8.4.3 Pointcuts in Spring | 185 |
8.4.4 Advices in Spring | 186 |
8.4.5 Bin¨arcode erzeugen – JDK versus CGLIB | 190 |
8.4.6 Testen des Aspekts | 190 |
8.4.7 Das Spring-Aspekt-Toolset | 192 |
8.5 Transaktionen in Spring | 194 |
8.5.1 Grundlagen und das ACID-Prinzip | 195 |
8.5.2 Der Transaktionsmanager | 196 |
8.5.3 Beeinflussung des Transaktionsverhaltens | 198 |
8.5.4 Transaktionsverläufe | 200 |
8.5.5 Deklarative Transaktionsdurchführung | 202 |
8.5.6 Programmatische Transaktionsdurchführung | 208 |
8.5.7 Durchführung von Transaktionstests | 210 |
Kapitel 9 Webanwendungen mit Spring und Hibernate | 214 |
9.1 Die Beispielanwendungen | 214 |
9.2 Spring und Webanwendungen | 217 |
9.2.1 Laden des Application-Contexts | 218 |
9.2.2 Integration mit JavaServer Faces | 220 |
9.2.3 Gültigkeitsbereich von Spring-Beans | 222 |
9.3 Hibernate und Webanwendungen | 224 |
9.3.1 OpenSessionInViewFilter | 224 |
9.3.2 Detached Objekte | 227 |
9.3.3 NonUniqueObjectException | 232 |
9.3.4 Behandlung von Exceptions | 234 |
9.3.5 Konkurrierender Zugriff | 235 |
9.3.6 Nebenläufigkeit | 237 |
9.3.7 Connection-Pooling | 239 |
9.3.8 Caching | 241 |
9.4 Zugriffsschutz mit Acegi | 246 |
9.4.1 Authentifizierung | 247 |
9.4.2 Autorisierung | 252 |
9.4.3 Filter in Reihenschaltung | 254 |
9.4.4 Acegi-Tags | 257 |
9.4.5 Acegi und JSF | 257 |
9.5 Alles im Fluss mit Spring Web Flow | 259 |
9.5.1 Endlich automatisch | 261 |
9.5.2 Spring Web Flow mit JavaServer Faces | 263 |
9.5.3 Flow-Persistence-Context | 266 |
9.6 Testmöglichkeiten | 272 |
9.6.1 Test von JSF-Komponenten und Spring | 272 |
9.6.2 Testbeispiel Bestellvorgang | 275 |
Kapitel 10 Integration in die JEE-Welt | 280 |
10.1 Eine RMI-Anbindung | 282 |
10.1.1 Exportieren der Service-Schnittstelle | 283 |
10.1.2 Konfiguration der Client-Anbindung | 284 |
10.1.3 Implementierung der Client-Klasse | 285 |
10.2 Die EJB-Schicht der Opiz-Anwendung | 286 |
10.3 Implementierung einer Stateless-Session-Bean | 287 |
10.3.1 Die Remote- und Home-Schnittstellen | 287 |
10.3.2 Die Implementierung der Session-Bean | 288 |
10.3.3 Die BeanFactory finden | 289 |
10.3.4 Deployment | 291 |
10.4 Stateful-Session-Beans | 292 |
10.4.1 Remote- und Home-Schnittstellen | 292 |
10.4.2 Die Implementierung der Stateful-Session-Bean | 293 |
10.4.3 Deployment | 294 |
10.5 Message-Driven-Beans | 294 |
10.6 Client-Anbindung an den EJB-Container | 294 |
10.6.1 Zugriff auf eine Stateless-Session-Bean | 295 |
10.6.2 Zugriff auf eine Stateful-Session-Bean | 297 |
10.7 Testmöglichkeiten | 299 |
10.8 Springs Unterstützung für JMX | 301 |
10.8.1 Registrierung der Spring-Beans beim JMX-Server | 302 |
10.8.2 Konfiguration mit einem Interface | 303 |
10.8.3 Konfiguration mit Annotations | 304 |
10.8.4 JMX ohne einen Applikations-Server? | 306 |
10.9 Spring-Integration von JCA | 308 |
10.9.1 Konfiguration des Resource-Adapters | 309 |
10.9.2 Nutzung des Resource-Adapters | 310 |
Stichwortverzeichnis | 314 |