Ich entwickle ein relativ großes Projekt mit Spring Boot, und generell bin ich ziemlich glücklich damit, aber ich habe einige Probleme, die meiner Meinung nach kein Problem darstellen sollten.
Erstens, Eins-zu-Eins-Beziehung. Es ist frustrierend, dass es nicht funktioniert (zumindest in meinen Gedanken).
Ich habe zwei Entitäten, zum Beispiel User
und UserProfile
. Sie haben One-to-One-Beziehung, aber die meiste Zeit brauche ich nur die User
Daten, aber es holt (egal was ich versuche, und oh Junge, ich habe die Welt Vorschläge für jeden Beitrag für 5 Seiten von Google versucht ).
Es gibt also meine erste Frage: Gibt es eine Möglichkeit, in JPA und Spring eine Eins-zu-eins-Beziehung faul zu machen? (Weil die meisten Beiträge mehr als 2-3 Jahre alt sind).
Das andere Problem, das ich habe, ist eine "dynamische" JSON-Antwort zu erstellen. Ich habe ein paar Sachen mit Rails gemacht und war sehr glücklich mit JBuilder
oder sogar mit to_json
, was mir die Fähigkeit gab, die json Antwort zu erstellen, abhängig vom Controller und meinen Bedürfnissen im Moment.
Im Frühjahr sah ich die folgenden Lösungen:
Jackson @JsonView
(was mein Problem nicht vollständig löst, weil die Antworten nicht so statisch sind und ein Attribut nicht mehreren Ansichten zugewiesen werden kann (soweit ich das Konzept verstanden habe); HashMap
like Ich baue .json.jbuilder
auf Rails (aber das macht meine Leistung zunichte, da es manchmal Beziehungen hat, also eine Menge for
, um den JSON zu erstellen, und auch das sieht wie ein hässlicher Durchlauf aus) / li>
Ich suche nach Anweisungen von jemandem, der eines Tages vielleicht eines dieser Probleme angetroffen hat, weil es mich umbringt, nicht in der Lage zu sein, Probleme zu lösen, die in meinen Gedanken nicht so schwer sein sollten.
BEARBEITEN 1
Bereits versucht, optional = false
in der @OneToOne
-Anmerkung hinzuzufügen, um die Eager-Last der OneToOne-Beziehung zu lösen, wie @snovelli vorgeschlagen hat. Beispiel:
Wenn die Join-Spalte nicht in der Tabelle enthalten ist, der ein übergeordnetes Element in einer Eins-zu-Eins-Zuordnung zugeordnet ist, wird die Verknüpfung . Der Grund dafür ist, dass der JPA-Provider nicht bestimmen kann, ob der Proxy erstellt werden soll, damit er das Objekt beim späteren Zugriff laden kann, oder den null
-Wert beibehalten.
Auch wenn die Zuordnung nicht optional ist, muss der JPA-Anbieter die ID der verknüpften Entitätsinstanz ermitteln, um sie im Proxy zu speichern. Daher muss es trotzdem zur zugehörigen Tabelle gehen.
Lösungen:
null
, andernfalls list.get(0)
. Sie können dies natürlich in der Entitätsklasse kapseln (Getter gibt das einzige Element der Liste oder null
zurück). Der Nachteil ist, dass Sie dies als Sammlung in JPQL-Abfragen behandeln müssen. @PrimaryKeyJoinColumn
anstelle eines Fremdschlüssels. Wenn die Zuordnung nicht optional ist ( optional = false
), dann weiß der JPA-Provider, dass es ein untergeordnetes Kind mit der gleichen PK gibt. Daher wird nur die PK des Elterns als die ID des untergeordneten Elements im Proxy gespeichert. Natürlich können Sie nicht zwei unabhängige ID-Generatoren für beide Entitäten verwenden, da sich die PK sonst unterscheiden können. Dies ist der beste Ansatz, wenn er Ihren Anforderungen entspricht. Übergeordnete Entität einer Datenbankansicht zuordnen, die die übergeordnete Tabelle mit der untergeordneten Tabelle verbindet und alle übergeordneten Spalten sowie die ID der untergeordneten Tabelle enthält:
%Vor%In Bezug auf 'dynamisches' JSON: Verwenden Sie DTOs .
Dies hat den Vorteil, dass die zu serialisierenden Objekte genau auf die Bedürfnisse des Clients zugeschnitten werden, der den resultierenden JSON verbraucht. Außerdem ist das Domänenmodell (Hibernate-Entitäten) von der JSON- (De-) Serialisierungslogik entkoppelt, so dass sich beide unabhängig entwickeln können.
Betreffend @OneToOne
: Sorgen Sie sich mehr um Datenmenge oder mehrere Abfragen gegen die DB?
Im ersten Fall (wenn das bei der Verwendung von Spring Roo möglich ist) könnten Sie eine Umgehung mit @ManyToOne
relation modeling versuchen (Eins-zu-eins ist ein Sonderfall von n: 1, nicht wahr?).
In letzterem Fall könnten Sie @Embeddable
verwenden, um eine Entity wie User in mehrere Klassen zu zerlegen, während die Daten in der DB zusammengehalten werden, sodass nur eine Abfrage verwendet wird, um sie abzurufen.
Tags und Links java jpa spring jackson spring-boot