Inhalt | 8 |
Einführung | 14 |
Bevor es losgeht | 14 |
Zielgruppe und Leseregeln | 15 |
Application-Server, Tools und Codebeispiele | 16 |
Formatierungen und Sprachgebrauch | 17 |
Danksagung | 18 |
Feedback | 18 |
1 Technische Grundlagen undhistorische Entwicklungen | 20 |
1.1 Client-Server-Systeme | 20 |
1.2 Die 3-Schichten-Architektur | 23 |
1.3 Ein bisschen Komponenten-Theorie | 26 |
1.4 EJBs und die Java Enterprise Edition | 29 |
1.5 Handwerkszeug aus der Java Standard Edition 5 | 31 |
1.5.1 Annotationen | 31 |
1.5.2 Generics | 32 |
1.5.3 Autoboxing | 33 |
2 Erste Schritte | 34 |
2.1 Die Neuheiten kurz gefasst | 34 |
2.2 Hello World | 37 |
2.2.1 Installation der JEE-Plattform | 37 |
2.2.2 Implementierung einer EJB | 38 |
2.2.3 Installation der EJB (Deployment) | 39 |
2.2.4 Implementierung des Clients | 41 |
2.2.5 Aufräumen | 44 |
2.3 Spielregeln | 45 |
2.3.1 Rollen | 45 |
2.3.2 Einschränkungen im Programmiermodell | 46 |
2.4 Wie es weitergeht | 49 |
3 SessionBeans | 50 |
3.1 Einführung | 50 |
3.2 Stateless SessionBeans | 52 |
3.2.1 Bestandteile einer Stateless SessionBean | 54 |
3.2.2 Implementierung im Detail | 57 |
3.2.3 Lokaler Zugriff auf Stateless SessionBeans | 63 |
3.2.4 Stateless SessionBeans als Webservice-Endpunkt | 67 |
3.2.5 Asynchrone Bean-Methoden | 71 |
3.2.6 Neue Beans und alte Clients – EJB2-Sicht auf EJB3-SessionBeans | 73 |
3.3 Stateful SessionBeans | 74 |
3.3.1 Bestandteile einer Stateful SessionBean | 76 |
3.3.2 Lifecycle und Event-Callback-Methoden | 78 |
3.3.3 Abschließende Bemerkungen | 82 |
3.4 Singleton SessionBeans | 82 |
3.4.1 Bestandteile einer Singleton SessionBean | 83 |
3.4.2 Steuerung des parallelen Zugriffs | 85 |
3.5 Paralleler Zugriff auf SessionBeans | 89 |
3.6 Session-Context | 90 |
3.7 Exceptions | 92 |
3.7.1 Applikations- und System-Exception | 92 |
3.8 Alternative zur Annotation: Der XML-Deskriptor | 94 |
4 Entities | 98 |
4.1 Das Problem mit der Persistenz | 98 |
4.2 Einige Grundlagen | 100 |
4.2.1 Die Data-Source | 100 |
4.2.2 Die wichtigsten Begriffe vorweg | 102 |
4.3 Eine erste Datenbankanwendung | 107 |
4.3.1 Der Lebenszyklus von Entities | 111 |
4.3.2 Grundfunktionen des Entity-Managers | 115 |
4.4 O/R-Mapping | 117 |
4.4.1 Abbildung von Klassen auf Tabellen | 117 |
4.4.2 Abbildung von Attributen auf Spalten | 121 |
4.4.3 Abbildung von Vererbungen | 136 |
4.4.4 Steuerung des Persistence-Providers | 144 |
4.5 Beziehungen | 147 |
4.5.1 Bi- und unidirektionale Beziehungen verstehen | 147 |
4.5.2 Beziehungstypen | 149 |
4.5.3 1:1-Beziehungen | 150 |
4.5.4 1:N-Beziehungen | 154 |
4.5.5 N:1-Beziehungen | 160 |
4.5.6 N:M-Beziehungen | 162 |
4.5.7 Noch mehr Beziehungen | 165 |
4.6 Validierung | 168 |
4.6.1 Validierte Entities in 5 Minuten | 168 |
4.6.2 Bean Validation und die persistence.xml | 169 |
4.6.3 APIs verheiraten | 171 |
4.7 Abfragen | 172 |
4.7.1 JPA-Schnittstellen für Abfragen | 175 |
4.7.2 Alles Wesentliche auf einen Blick | 176 |
4.7.3 GROUP-BY und HAVING | 183 |
4.7.4 SELECT | 184 |
4.7.5 ORDER-BY | 185 |
4.7.6 Unterabfragen | 185 |
4.7.7 Massenlöschungen und -aktualisierungen | 186 |
4.7.8 SQL-Abfragen | 187 |
4.7.9 Benannte Abfragen | 189 |
4.7.10 Einfach typisierte Abfragen | 190 |
4.8 Das Criteria-API | 190 |
4.8.1 Das Metamodell | 192 |
4.9 Noch mehr Entities | 196 |
4.10 Entities im Rückblick | 198 |
5 Message-Driven Beans | 200 |
5.1 Einführung | 200 |
5.2 Nachrichtenbasierte Systeme mit JMS | 201 |
5.2.1 Der Nachrichtenserver als Kommunikationsbus | 202 |
5.2.2 Einer sendet, einer empfängt – das Punkt-zu-Punkt-Modell | 202 |
5.2.3 Einer sendet, viele hören zu – das Publish-Subscribe-Modell | 207 |
5.3 Bestandteile einer Message-Driven Bean | 209 |
5.3.1 Lebenszyklus einer Message-Driven Bean | 209 |
5.3.2 Bestandteile einer Message-Driven Bean | 210 |
5.4 Alternative zur Annotation: Der XML-Deskriptor | 213 |
5.5 Abschließende Bemerkungen | 214 |
6 EJB-Konfiguration | 216 |
6.1 Einführung | 216 |
6.2 Der lokale JNDI-Kontext | 216 |
6.2.1 Dependency-Lookup | 218 |
6.2.2 Dependency Injection | 218 |
6.3 EJB-Referenzen | 219 |
6.4 Konfigurations-Parameter | 223 |
6.5 Ressourcen-Manager-Fabriken | 224 |
6.6 Nachrichtenziele | 227 |
6.7 Noch mehr referenzierte Objekte | 229 |
6.8 Abschließende Bemerkungen zum Deployment-Deskriptor | 230 |
7 Transaktionen | 234 |
7.1 Systemkonsistenz in Komponentenarchitekturen | 234 |
7.1.1 Ressourcen | 236 |
7.2 Container-verwaltete Transaktionen | 239 |
7.2.1 Zurückrollen von CMTs | 240 |
7.2.2 Deklaration von CMTs | 243 |
7.2.3 CMTs in Message-Driven Beans | 247 |
7.2.4 Situationen mit unspezifiziertem Transaktionskontext | 247 |
7.3 Bean-verwaltete Transaktionen | 248 |
7.4 Transaktionale Ressourcen | 251 |
7.4.1 Persistenzkontexte | 251 |
7.4.2 Data-Sources | 251 |
7.4.3 JMS-Verbindungen | 253 |
7.4.4 Stateful SessionBeans und SessionSynchronization | 254 |
7.5 Client-verwaltete Transaktionen | 257 |
8 Sicherheit | 260 |
8.1 Einführung | 260 |
8.2 Wer klopft denn da? – Die Authentifizierung | 260 |
8.2.1 Erste Schritte | 260 |
8.2.2 Der Caller-Principal | 262 |
8.2.3 Principal Delegation | 262 |
8.2.4 Technische Details der Authentifizierung des Clients | 263 |
8.2.5 Serverseitige Authentifizierung | 269 |
8.3 Rollenbasierte Autorisierung | 273 |
8.3.1 Deklaratives Sicherheitsmanagement | 274 |
8.3.2 Programmatisches Sicherheitsmanagement | 276 |
8.3.3 Abbildung der logischen Rollen | 277 |
8.3.4 Grenzen des rollenbasierten Ansatzes | 278 |
8.4 Datenverschlüsselung und Integrität | 278 |
9 Noch mehr EJBs | 282 |
9.1 Timed Objects | 282 |
9.2 Einfache Aspektorientierung mit EJB3 | 287 |
9.2.1 Interceptor-Methoden | 288 |
9.2.2 Interceptor-Klassen | 291 |
9.2.3 Interceptoren für Timer-Methoden | 295 |
9.2.4 Aspekte über XML-Deskriptoren | 295 |
9.3 Ein alternativer Weg zur Remote-Referenz: Der Handle | 297 |
9.4 EJBs ohne Application-Server betreiben | 298 |
10 Blick über den Tellerrand | 300 |
10.1 Testen von EJBs | 300 |
10.1.1 Warum Testen? | 300 |
10.1.2 Unit-Tests mit Entities und Dependency-Injection | 302 |
10.1.3 EJB lite als Test-Umgebung | 303 |
10.1.4 Weitere Test-Alternativen | 304 |
10.2 Wichtige EJB-Entwurfmuster | 305 |
10.2.1 Evtl. bekannte Muster sind weiter gültig | 305 |
10.2.2 Neue Muster mit EJB 3.0 | 308 |
10.2.3 Was es nicht mehr gibt | 309 |
10.3 Migration auf EJB3 | 310 |
10.3.1 Drei (und eine) Migrations-Strategien | 311 |
10.3.2 Migrieren, aber wie? | 313 |
11 EinStein würfelt nicht | 318 |
11.1 Zum Spiel | 318 |
11.2 Funktionsweise der Spielplattform | 320 |
11.3 Technisches Modell | 321 |
11.3.1 Versuchungen | 321 |
11.3.2 Design-Entscheidungen | 322 |
11.3.3 Das Komponentenmodell | 324 |
11.3.4 Das Entitätenmodell | 325 |
11.3.5 Die Package-Struktur | 326 |
11.4 Hingucker | 327 |
11.5 Erweiterungsmöglichkeiten | 330 |
11.6 Einige Anmerkungen zum Schluss | 331 |
12 Kochrezepte | 334 |
12.1 Ein einfacher lokaler Read-Only-Cache | 335 |
12.2 Getaktete Datenquelle | 336 |
12.3 Vereinfachtes EJB Deployment | 338 |
12.4 EJB und JSF | 339 |
12.4.1 ManagedBeans als EJB-Client | 339 |
12.4.2 SessionBeans als ManagedBeans | 340 |
12.5 Fehler aus Webservices melden | 342 |
12.6 Stateless SessionBean als RESTful Webservice | 344 |
12.7 Dateiexport | 346 |
12.8 Eine Basis-Entität | 349 |
12.9 Suchfunktion | 352 |
12.10 Bitte umblättern | 356 |
12.10.1 Variante 1 – Alles dem Client überlassen | 356 |
12.10.2 Variante 2 – Verwaltung im Application-Server | 356 |
12.10.3 Variante 3 – Verwaltung in der Datenbank | 358 |
12.10.4 Noch eine Variante aus dem Internet | 360 |
12.11 Lokale Tests mit OpenEJB | 361 |
12.11.1 SessionBeans testen | 361 |
12.11.2 JPA-Tests | 362 |
Literatur | 366 |
Register | 368 |