Ermitteln doppelter Elemente beim Abfragen einer Sammlung mit Spring Data Rest

9

Ich habe doppelte Ergebnisse für eine Sammlung mit diesem einfachen Modell: eine Entität Module und eine Entität Page . A Module hat eine Gruppe von Seiten und eine Page gehört zum Modul.

Dies wird mit Spring Boot mit Spring-Daten-JPA und Spring-Datenruhe .

Der vollständige Code ist auf GitHub

verfügbar

Entitäten

Hier ist der Code für die Entitäten. Die meisten Setter wurden aus Platzgründen entfernt:

Modul.java

%Vor%

Seite.java

%Vor%

Repositories

Nun der Code für die Spring-Repositories, der ziemlich einfach ist:

ModuleRepository.java

%Vor%

PageRepository.java

%Vor%

Konfig

Die Konfiguration kommt von 2 Dateien:

Anwendung.java

%Vor%

application.properties

%Vor%

Datenbank

Abschließend das Datenbankschema und einige Testdaten:

schema.sql

%Vor%

data.sql

%Vor%

Das ist es. Jetzt starte ich also von der Kommandozeile aus, um die Anwendung zu starten: mvn spring-boot:run . Nach dem Start der Anwendung kann ich den Hauptendpunkt wie folgt abfragen:

Holen Sie sich API %Vor% Antwort %Vor% Holen Sie sich alle Module %Vor% Antwort %Vor% Holen Sie sich alle Seiten für ein Modul %Vor% Antwort %Vor%

Wie Sie sehen können, bekomme ich hier zweimal dieselbe Seite. Was ist los?

Bonusfrage: Warum funktioniert das?

Ich habe den Code gereinigt, um diese Frage zu stellen, und um ihn kompakter zu gestalten, habe ich die JPA-Anmerkungen in der Entität Page auf die Feldebene verschoben:

Seite.java

%Vor%

Der Rest der Klasse bleibt gleich. Dies ist im selben GitHub-Repo auf dem Zweig auf Feldebene zu sehen.

Wie sich herausstellt, wird beim Ausführen derselben Anfrage mit der Änderung an der API das erwartete Ergebnis (nach dem Start des Servers auf die gleiche Weise wie zuvor) ausgegeben:

Holen Sie sich alle Seiten für ein Modul %Vor% Antwort %Vor%     
alejo 02.07.2015, 05:45
quelle

1 Antwort

2

Dies verursacht Ihr Problem (Page Entity):

%Vor%

Hibernate verwendet Ihre Setter, um die Entität zu initialisieren, da Sie die JPA-Annotationen auf Getter setzen.

Initialisierungssequenz, die das Problem verursacht:

  1. Modulobjekt erstellt
  2. Set-Moduleigenschaften (die Seiten werden initialisiert)
  3. Seitenobjekt erstellt
  4. Fügen Sie die erstellte Seite zu Module.pages
  5. hinzu
  6. Festlegen der Seiteneigenschaften
  7. setModule wird für das Page-Objekt aufgerufen, und dies fügt (addPage) die aktuelle Seite zu Module.pages zum zweiten Mal hinzu

Sie können die JPA-Annotationen in die Felder einfügen und es wird funktionieren, weil die Setter während der Initialisierung nicht aufgerufen werden (Bonusfrage).

    
Cyril 20.01.2016, 19:55
quelle