Zum Inhalt springen
Anjunar/ DOCS

Graphen und Referenzen

JPA-Entity-Graphen bestimmen, wie tief eine Entity geschrieben und gelesen wird. Referenzen kommen per ID, und beide Seiten einer Beziehung bleiben synchron.

Entity-Graphen

Derselbe Graph zum Laden und zum Mappen

Übergib einen EntityGraph, dann werden bei Klassen mit EntityProvider nur die Attribute des Graphen und seiner Subgraphen serialisiert. Die Abfrage, die die Entity geladen hat, und das JSON beschreiben dieselbe Form.

scala
val graph = entityManager.getEntityGraph("Article.full") val article = entityManager.find(classOf[Article], id, java.util.Map.of("jakarta.persistence.fetchgraph", graph)) JsonMapper.serialize(article, TypeResolver.resolve(classOf[Article]), graph, inject)

@JsonbGraphProperty(transitive = true) nimmt eine Property unabhängig vom Graphen auf. Eine Property namens links ist immer dabei, für Hypermedia-Links.

Schreiben

Graphen begrenzen auch Updates

Ist das Ziel eine gespeicherte Entity (version über -1) und ein Graph gegeben, werden nur dessen Attribute geschrieben. Ein Client kommt nicht tiefer als der Graph, den er bekommen hat.

scala
trait EntityProvider { def id: UUID def version: Long // -1 for a new, unsaved entity }
Referenzen

Per ID, über den EntityLoader

Ein verbundenes Objekt, das das Ziel noch nicht hält, wird über die "id" in seinem JSON aufgelöst. Der Loader liefert die verwaltete Instanz, die als Referenz gesetzt wird; unbekannte IDs erzeugen eine neue Instanz.

scala
val loader: EntityLoader = (id, clazz) => entityManager.find(clazz, id)
json
{"title": "Graphs", "author": {"id": "3f1c9a52-7c0e-4f6b-9b1d-2a8e5c7d4f10"}}
Beziehungen

Beide Seiten bleiben konsistent

Nach dem Setzen einer JPA-Beziehung aktualisiert der Mapper die Gegenseite: die besitzende Seite aus mappedBy, die inverse Collection eines @ManyToOne oder den Partner eines @ManyToMany.

@OneToMany

Kinder bekommen ihr Elternteil

Bei jedem Element wird die mappedBy-Property auf den Besitzer gesetzt.

@ManyToOne

Das Elternteil bekommt das Kind

Der Besitzer kommt in die inverse Collection des neuen Elternteils.

@OneToOne · @ManyToMany

Partner zeigen zurück

Property oder Collection des Partners zeigt auf den Besitzer.