Java-Persistenz mit Hibernate

Christian Bauer, Gavin King

Java-Persistenz mit Hibernate

2007

729 Seiten

Format: PDF, Online Lesen

E-Book: €  47,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446413825

 

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

 

© 2009-2018 ciando GmbH