2016-04-26 19 views
4

Ich habe ein einfaches Projekt läuft Frühlings-Data-Rest haben einige Einheiten über eine REST-API zu belichten, wie dieser (vereinfacht, minus Setters/Getter):Customizing Spring Data Erholung @ManyToMany Beziehung Umgang

@Entity 
public class Group { 

    @Id 
    @GeneratedValue 
    private int id; 

    ... 

} 

@Entity 
public class Person{ 

    @Id 
    @GeneratedValue 
    private int id; 

    ... 

} 

Nun kann natürlich jede Gruppe Personen als Mitglieder haben, was ganz einfach über @ManyToMany gelöst werden kann. Leider (oder typischerweise?) Enthält eine Gruppenmitgliedschaft mehr Informationen als nur "ist Mitglied von". Zum Beispiel sollte es auch die Information "is admin of" oder "is hidden member of" enthalten.

Dies natürlich eine zusätzliche Einheit führt ...

@Entity 
public class GroupMember { 

    @OneToOne(optional = false) 
    @JoinColumn(updatable = false) 
    private Person member; 

    @OneToOne(optional = false) 
    @JoinColumn(updatable = false) 
    private Group group; 

    private boolean admin; 

    private boolean hidden; 

     ... 

} 

Was nicht so schlimm wäre, aber leider zu einem Problem führt ... ich kann nicht mehr nur Mitglieder zu einer Gruppe von POST ing hinzufügen ein text/uri-list zu (zum Beispiel) /groups/1/members, aber ich muss stattdessen eine neue GroupMember-Entität erstellen, indem Sie an /groupMembers/, die, IMHO, nicht mehr so ​​komfortabel ist und die Kohäsion der Gruppe REST "Baum" bricht.

Wie kann ich das lösen und einem einfachen POST erlauben, ein (grundlegendes) GroupMember mit Standardwerten zu erstellen? Natürlich könnte ich dort einen neuen @RepositoryRestController setzen, der jede POST-Anfrage an /groups/1/members abfängt, aber das verhindert die Liste der Text/URI-Liste (da es das scheinbar nicht unterstützt). Ich könnte ein neues Objekt definieren, zum Beispiel mit einer Personen-ID, aber dies würde den Fluss unterbrechen, das einfache Posten einer Linkliste wäre besser.

Eine andere Möglichkeit wäre es, einen Weg zu finden, das Hibernate @ManyToMany selbst ohne eine zusätzliche Einheit zur Karte ... Aber ich weiß nicht, eine solche Art und Weise ...

+0

Feder-data-Rest sollte über eine Option, damit Sie die Join-Tabelle Objekt angeben, aber dann le t Reduzieren Sie die Uri-Struktur, solange Sie angeben, wie die Anzahl der zusätzlichen Spalten einer Join-Tabelle verringert wird. – kenny

Antwort

1

Wenn Sie mit Federdaten Ruhe arbeiten und wollen text/uri-list in einem benutzerdefinierten Controller Griff können Sie den Wert übergeben Sie einen Parameter vom Typ Resources wie folgt aus:

@RequestBody Resources<Object> incoming 

Sie die URIs erhalten durch incoming.getLinks() Aufruf

Sie können die Federdaten Rest Controller als Referenz suchen - org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController#createPropertyReference

+1

Danke, das war sehr hilfreich. Ich habe auch einen Weg gefunden, den UriToEntityConverter zu verwenden, so dass ich jetzt mein POST/PUT-Verhalten überschreiben kann, um Links zu Personen zu akzeptieren und automatisch GroupMember-Entitäten für sie zu erstellen. –

0

Ich glaube, dass es recht Am besten haben Sie eine dritte Entität, GroupMember, wie Sie vorgeschlagen haben. Können Sie immer noch einen API-Endpunkt bereitstellen, über den Sie auf /groups/1/members veröffentlichen können? Um Ihnen zu helfen, müssen Sie in Ihrem Controller eine Geschäftslogik haben, die die entsprechenden Personen auflöst und GroupMember-Instanzen erstellt. Dies scheint mir der geeignete Ort für diese Geschäftslogik zu sein.

+0

Wie gesagt, ich hätte lieber eine Möglichkeit, Personen in die Mitgliederliste einzutragen und dann automatisch GroupMembers erstellen zu lassen. Leider scheint mein eigener BasePathAwareController nicht in der Lage zu sein, text/uri-list Content-Typen zu verarbeiten (ergibt 415), so dass ich das nicht simulieren kann, sondern eine JSON-Repräsentation erstellen müsste, die den Fluss unterbrechen würde (weil es sich von der Behandlung anderer Sammlungen unterscheiden würde). –

Verwandte Themen