9

Ich habe eine @Entity namens Benutzer. Es hat eine Reihe von Change wie folgt:Spring Data Rest Bildbare Child Collection

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user") 
private Set<Changeset> changesets = new HashSet<Changeset>(); 

ich UserRepository haben:

@Repository 
@RestResource(path = "users", rel = "users") 
public interface UserRepository extends JpaRepository<User, Long>{ } 

Und ein ChangesetRepository:

@Repository 
@RestResource(path = "changesets", rel = "changesets") 
public interface ChangesetRepository extends JpaRepository<Changeset, Long> { } 

Aufruf GET auf http://localhost:8080/changesets/ oder http://localhost:8080/users/ ergibt eine ausgelagerte Reaktion.

Wenn ich GET auf http://localhost:8080/users/1/changesets aufrufen, dann bekomme ich alle Ergebnisse in einem einzigen Array und kein Paging auftritt.

Gibt es eine Möglichkeit, Spring Data Rest anzugeben, dass ich die Changesets-Auflistung auf eine auslagerbare Weise zurückgeben möchte, wenn ich über den übergeordneten Benutzer darauf zugreife? Das Set von Changesets wird schnell wachsen und ich würde lieber nicht Tonnen von Ergebnissen auf einer einzelnen Seite zurückgeben.

EDIT:

Wie von Willie Wheeler schlug ich hinzugefügt, dies zu meinem ChangesetRepository machen es durchsuchbar:

@RestResource(path = "byUser", rel = "byUser") 
public Page<Changeset> findByUser(@Param("id") User user, Pageable p); 

ich die Beziehung bidirektionale links, sondern war auch in der Lage die Verbindung zu Changesets zu verstecken ein Benutzer mit @RestResource(exported=false) auf dem Set von Changesets.

Seite Hinweis: Es scheint, dass das Festlegen der Beziehung zu exportierte = false den Link verbirgt, aber das Mapping tatsächlich nicht entfernt./users/1/changesets wird nicht angekündigt, ist aber immer noch gültig.

Antwort

8

Ich glaube nicht, dass SDR direkt unterstützt den Ansatz, den Sie beschreiben.

Es gibt einen anderen Ansatz, den Sie vielleicht machen könnten. Anstatt eine bidirektionale Beziehung zwischen Person und Changeset zu verwenden, machen Sie es unidirektional von Changeset zu Person. Dann in Ihrem ChangesetRepository umfassen ein Verfahren wie folgt aus: (. Ich bin nur, dass aus dem Gedächtnis zu tun, so dass Sie kleinere Anpassungen erforderlich machen könnten)

@RestResource(path = "find-by-person") 
Page<Changeset> findByPerson(@Param("person") Person person, Pageable pageable); 

Aus gestalterischer Sicht Ich denke, das ohnehin stärker ist, seit ich mir vorstelle, dass die Veränderungen einer Person in einer begrenzten Anzahl von Kontexten relevant sind. Es ist möglicherweise sinnvoller, Änderungssets abzufragen, als sie mit der Person zu bündeln.

+0

Das ist ein guter Vorschlag. Ich habe es tatsächlich implementiert und es ist ziemlich nett. Ich werde meinen Beitrag mit Details bearbeiten! –

+0

Ich werde Ihre Antwort akzeptieren. Ich wollte nur sehen, ob irgendjemand mit einer SDR-spezifischen Einstellung durchkam, die das ermöglichte, was ich wollte. –

+0

Sollte 'Seite ' als Rückgabetyp anstelle von 'List ' –