2016-03-20 4 views
14

Ist es möglich, zwei verschiedene Repositorys für dieselbe JPA-Entität mit Spring Data Rest zu veröffentlichen? Ich gab den zwei Repositories verschiedene Pfade und Rel-Namen, aber nur einer der beiden ist als REST-Endpunkt verfügbar. Der Punkt, warum ich zwei Repositories habe, ist, dass einer von ihnen ein Auszug ist, der nur die grundlegenden Felder einer Entität zeigt.Mehrere Repositorys für dieselbe Entität im Frühjahr Datenrest

+1

Dies ist nicht möglich. Mit Spring Data REST ist eine verwaltete Ressource eine Entität, kein Repository. Die Bibliothek verwaltet eine "Map" von verwalteten Ressourcen, wobei der Schlüssel die Entitätsklasse ist. Daher kann die Entität immer nur einer Repository-Schnittstelle zugeordnet werden (da eine Map nur einen Wert für einen Schlüssel enthalten kann). Wenn es für Ihre Anwendung von entscheidender Bedeutung ist, dass mehrere Repositorys pro Entitätsklasse vorhanden sind, sollten Sie eine Verbesserungsanfrage beim Spring Data-Team stellen. – manish

+0

Es gibt MultiMaps. Technisch gibt es sicher keine Hürde. Aus einer semantischen Sicht kann in unseren Anwendungsfällen eine Ressource nicht mit einer Entität, sondern mit einer Sicht im Sinne einer DB identifiziert werden. Ansichten entsprechen Projektionen im Frühjahr Datenrest. Es wäre also großartig, wenn ich Projektionen und Operationen auf Ressourcen abbilden könnte. – Gregor

+0

Mein Kommentar basierte auf der [tatsächlichen Spring Data REST-Implementierung] (https://github.com/spring-projects/spring-data-rest/blob/master/spring-data-rest-core/src/main/java /org/springframework/data/rest/core/config/ResourceMappingConfiguration.java). Ich weiß, dass es Strukturen wie "MultiMap" gibt, weshalb ich vorgeschlagen habe, dass Sie erwägen, eine Verbesserungsanfrage mit dem Spring Data-Team zu stellen. – manish

Antwort

1

Die Antwort scheint zu sein: Es ist nur ein Repository pro Entität möglich.

8

Der schreckliche Teil ist nicht nur, dass Sie nur 1 Federdaten Rest Repository (@RepositoryRestResource) pro Entity haben kann, aber auch, dass, wenn Sie eine regelmäßige JPA @Repository (wie CrudRepository oder PagingAndSorting) haben es auch mit interagieren die Federdaten liegen bei eins (da der Schlüssel in der Karte die Entität selbst ist). Verloren ziemlich viele Stunden, die zufällige Last des einen oder des anderen debuggen. Ich denke, wenn dies eine harte Einschränkung der Federdaten ist, kann zumindest eine Ausnahme ausgelöst werden, wenn der Schlüssel der Karte bereits vorhanden ist, wenn versucht wird, den Wert zu überschreiben.

+0

Ich habe eine Jira-Ausgabe für dieses erstellt: https://jira.spring.io/browse/DATAREST-923 fühlen Sie sich frei, es abzustimmen! – Tim

+0

Was wäre ein guter Usecase, so dass Sie zwei Repositories benötigen? – Tim

+0

Beispiel Use Case: Speichern in JPA + Verwenden Elasticsearch Repo für die Suche – aux

0

Also, dies beantwortet nicht direkt die Frage, kann aber helfen, das zugrunde liegende Problem zu lösen.

Sie können nur ein Repository pro Entität haben ... Sie können jedoch mehrere Entitäten pro Tabelle haben; Somit haben Sie mehrere Repositories pro Tabelle.

In einem Stück Code ich geschrieben habe, hatte ich zwei Einheiten ... mit einem automatisch generierten ID und eine andere mit einem voreingestellten ID zu erstellen, aber auf dem gleichen Tisch beide zeigen:

@Entity 
@Table("line_item") 
public class LineItemWithAutoId { 

    @Id 
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid") 
    private String id; 

    ... 
} 



@Entity 
@Table("line_item") 
public class LineItemWithPredefinedId { 

    @Id 
    private String id; 

    ... 
} 

Dann hatte ich ein Repository für jeden:

public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> { 

    ... 

} 


public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> { 

    ... 

} 

Für das veröffentlichte Problem könnten Sie zwei Entitäten haben. Einer wäre die vollständige Einheit, mit Gettern und Setter für alles. Die andere wäre die Entität, wo es für alles Setter gibt, aber nur Getter für die Felder, die Sie veröffentlichen möchten. Macht das Sinn?

Verwandte Themen