Lazy One-To-One Frühling JPA und Aufbau von "dynamischen" JSON

9

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.

  1. 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).

  2. 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);
    • Einstellung auf Null Attribute, die ich nicht auf die Antwort wollen (mit diesem, aber ich bin einfach zu hässlich und sieht aus wie eine falsche Walkthrough);
    • oder building 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:

%Vor%     
augustoccesar 17.03.2016, 13:11
quelle

3 Antworten

7

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:

  1. Bytecode-Instrumentierung . Allerdings nicht weit verbreitete Ansatz.
  2. Verwenden Sie one-to-many und behandeln Sie leere Liste als 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.
  3. Verwenden Sie @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.
  4. Fügen Sie auch den Fremdschlüssel in der übergeordneten Tabelle hinzu (wodurch die Beziehung auch in der Datenbank bidirektional wird). Der Nachteil ist, dass Sie jetzt grundsätzlich zwei unabhängige Verknüpfungen haben, die Sie pflegen müssen. Außerdem gibt es die Leistungskosten für die Aktualisierung von zwei Tabellen anstelle von einer (und die Fremdschlüssel müssen Nullwerte enthalten können).
  5. Ü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%
Dragan Bozanovic 21.03.2016, 23:46
quelle
2

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.

    
Dragan Bozanovic 22.03.2016 00:59
quelle
0

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.

    
MirMasej 21.03.2016 19:05
quelle

Tags und Links