🚀 Tag 8 - JPA Relationen Demo
Java Web Aufbau - @OneToOne & @ManyToOne
📚 Was wird demonstriert?
- @OneToOne Relation: User ↔ UserProfile (ein User hat EIN Profile)
- @ManyToOne Relation: Order → User (viele Orders gehören zu einem User)
- CascadeType.ALL: Profile wird automatisch mit User gespeichert/gelöscht
- orphanRemoval = true: Profile ohne User wird automatisch gelöscht
- FetchType.LAZY: User wird erst geladen, wenn benötigt
- JOIN FETCH: Vermeidet N+1 Problem bei Queries
- Bidirektionale Relationen: Navigation in beide Richtungen
🏗️ Projekt-Struktur
src/main/java/com/javafleet/
├── model/
│ ├── User.java (@OneToOne mit Profile, @OneToMany mit Orders)
│ ├── UserProfile.java (@OneToOne Gegenseite)
│ ├── Order.java (@ManyToOne mit User)
│ └── OrderStatus.java (Enum für Order Status)
├── service/
│ └── OrderManagementService.java (Business Logic)
└── web/
└── OrderServlet.java (Demo Servlet)
🎯 Lernziele
- @OneToOne Relationen mit CascadeType konfigurieren
- @ManyToOne Relationen mit Foreign Keys erstellen
- Bidirektionale Relationen richtig implementieren
- LAZY vs. EAGER Fetch Strategies verstehen
- N+1 Problem mit JOIN FETCH vermeiden
- Lifecycle Callbacks (@PrePersist) nutzen
- Production-Ready JPA Code schreiben
⚙️ Setup-Hinweise
Datenbank: Stelle sicher, dass eine MySQL-Datenbank läuft:
docker run --name mysql-jpa -e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=jpadb -p 3306:3306 -d mysql:8
DataSource: Konfiguriere in Payara die JDBC-Ressource:
- JNDI Name:
jdbc/jpadb
- URL:
jdbc:mysql://localhost:3306/jpadb
- User:
root
- Password:
secret