Mit Jakarta Persistence 3.2 (Teil von Jakarta EE 11) halten Java Records endgültig Einzug in die Welt der objekt-relationalen Abbildung. Java Records lassen sich nun nicht nur als kompakte Datencontainer nutzen, sondern auch als eingebettete Value Objects, Listen von Embeddables und sogar für zusammengesetzte Primärschlüssel. Das macht den Code kompakter, übersichtlicher und besser wartbar.
@Embeddable Records
Auch für einfache Wertobjekte mussten bisher Klassen mit Gettern, Settern, Konstruktoren und equals/hashCode-Methoden geschrieben werden. Mit Jakarta Persistence 3.2 genügt jetzt ein einfaches Record:
@Embeddable
public record Address(String street, String city, String postalCode) {}
In einem Entity kann dieses Address-Objekt direkt eingebettet werden:
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Embedded
private Address address;
}
Vorteile:
- Weniger Boilerplate: Records eliminieren viel Standard-Code, der bei klassischen POJOs nötig wäre
- Unveränderlichkeit: Felder sind final und können nach der Initialisierung nicht mehr geändert werden
- Wertbasierte Gleichheit:
equals()
undhashCode()
werden automatisch auf Basis aller Komponenten generiert
Listen von Records mit @ElementCollection
Auch die Speicherung mehrerer Adressen pro Kunde ist unkompliziert möglich. Mit @ElementCollection wird eine Liste von Embeddable-Records elegant und sauber verwaltet:
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@ElementCollection
private List<Address> addresses;
}
Die Zuordnung übernimmt Jakarta Persistence automatisch, inklusive separater Tabelle und Fremdschlüssel-Beziehung.
Vorteile:
- Address bleibt ein
@Embeddable Record
. - Mit
@ElementCollection
erzeugt JPA automatisch eine separate Tabelle für die Adressen, die über einen Fremdschlüssel mitCustomer
verknüpft ist. - Die Werte der Collection-Elemente werden in eigenen Zeilen gespeichert, die Zuordnung erfolgt über den Primärschlüssel des Entity.
Hinweis:
Ohne @ElementCollection
funktioniert eine Liste von Embeddables nicht korrekt. Mit der Annotation ist die Speicherung von Listen und Sets von Value Objects jedoch problemlos möglich.
Zusammengesetzte Primärschlüssel mit @EmbeddedId
Für zusammengesetzte Schlüssel können Records als eingebettete Schlüsselobjekte genutzt werden:
@Embeddable
public record OrderItemId(Long orderId, Long productId) {}
@Entity
public class OrderItem {
@EmbeddedId
private OrderItemId id;
private int quantity;
}
Vorteile:
- Alle Schlüssel-Felder sind gebündelt in einem Objekt.
equals()
undhashCode()
werden automatisch korrekt generiert.
Records als Schlüsselklasse mit @IdClass
Alternativ kann ein Record auch als Schlüsselklasse für mehrere @Id
-Felder verwendet werden. Das ist besonders nützlich, wenn das Entity selbst die Schlüssel-Felder enthält:
public record OrderItemId(Long orderId, Long productId) {}
@IdClass(OrderItemId.class)
@Entity
public class OrderItem {
@Id
private Long orderId;
@Id
private Long productId;
private int quantity;
}
Fazit: Weniger Ballast, mehr Klarheit
Mit Jakarta Persistence 3.2 und Java Records wird der Einsatz von unveränderlichen Wertobjekten und zusammengesetzten Schlüsseln deutlich eleganter und sicherer. Egal ob als eingebettetes Attribut, als Liste von Value Objects, als zusammengesetzter Primärschlüssel oder als Schlüsselklasse für mehrere IDs: Records sorgen für kompakteren, besser wartbaren Code und bringen moderne Java-Sprachelemente in die Persistenzschicht.
Quellen und weiterführende Links:
- Ausführliche Liste der Neuerungen: Jakarta Persistence 3.2 Specification
- Jakarta EE 11 erschien am 26. Juni 2025. Die wichtigsten Neuerungen sind Jakarta Data und die Unterstützung von Java 21.
- Java Records (JEP 395)
- Project Valhalla – Value Types in Java (Zukunft)