2016-03-20 32 views
14

Czy jest możliwe opublikowanie dwóch różnych repozytoriów dla tej samej jednostki JPA z Spring Data Rest? Dałem dwóm repozytoriom różne ścieżki i nazwy rel, ale tylko jeden z nich jest dostępny jako punkt końcowy REST. Powodem, dla którego mam dwa repozytoria jest to, że jeden z nich jest fragmentem, pokazującym tylko podstawowe pola jednostki.Wiele repozytoriów dla tej samej jednostki w Spring Data Rest

+1

To nie jest możliwe. Z REST z Spring Data zasób zarządzany to encja, a nie repozytorium. Biblioteka zachowuje "Mapę" zarządzanych zasobów, gdzie klucz jest klasą encji. W związku z tym encję można odwzorować tylko na jeden interfejs repozytorium naraz (ponieważ 'Map' może zawierać tylko jedną wartość dla klucza). Jeśli krytyczne jest, aby aplikacja miała wiele repozytoriów na klasę jednostek, możesz poprosić zespół ds. Danych źródłowych o rozszerzenie. – manish

+0

Istnieją MultiMaps. Technicznie na pewno nie ma przeszkód. Z semantycznego punktu widzenia, w naszych przypadkach użycia, zasób nie może być utożsamiany z jednostką, ale raczej z widokiem, w sensie DB. Widoki odpowiadają projekcjom w Spring Data Rest. Byłoby świetnie, gdybym mógł mapować Projekcje i operacje na nich na zasoby. – Gregor

+0

Mój komentarz został oparty na [rzeczywistej implementacji REST danych Spring] (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). Wiem, że istnieją struktury takie jak 'MultiMap's, dlatego zaproponowałem, abyś rozważył zgłoszenie prośby o ulepszenie z zespołem Spring Data. – manish

Odpowiedz

1

Odpowiedź wydaje się być: Istnieje tylko jedno repozytorium na jednostkę.

8

Straszne jest to, że nie tylko można mieć tylko 1 Karta wiosna repozytorium reszta (@RepositoryRestResource) na podmiot, ale także, że jeśli masz regularne WZP @Repository (jak CrudRepository lub PagingAndSorting) będzie również wchodzić w interakcje z dane spoczynkowe z wiosny (jako klucz na mapie jest samym elementem). Straciłem sporo czasu na debugowanie losowego obciążenia jednego lub drugiego. Sądzę, że jeśli jest to trudne ograniczenie wiosennych danych, to przynajmniej można wyrzucić wyjątek, jeśli klucz mapy już tam jest, gdy próbujesz przesłonić wartość.

+0

Stworzyłem problem Jira w tym celu: https://jira.spring.io/browse/DATAREST-923 zachęcamy do głosowania! – Tim

+0

Jaki byłby dobry użytek, więc potrzebujesz dwóch repozytoriów? – Tim

+0

przykład użycia: zapisz w WZP + użyj repozytorium Elasticsearch do wyszukiwania – aux

0

To nie odpowiada bezpośrednio na pytanie, ale może pomóc w rozwiązaniu problemu.

Możesz mieć tylko jedno repozytorium na jednostkę ... jednak możesz mieć wiele jednostek na tabelę; co za tym idzie, posiadanie wielu repozytoriów na tabelę.

w kawałku kodu pisałem, miałem utworzyć dwa podmioty ... Jeden z auto generowane ID i jedna z zadanym id, ale zarówno wskazując tym samym stole:

@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; 

    ... 
} 

Następnie miałem repozytorium dla każdego:

public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> { 

    ... 

} 


public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> { 

    ... 

} 

W przypadku opublikowanego problemu można mieć dwie jednostki. Jednym byłby cały byt, z bytami i ustawicielami dla wszystkiego. Drugi, to byt, w którym istnieją settery dla wszystkiego, ale tylko pobierające dla pól, które chcesz upublicznić. Czy to ma sens?

Powiązane problemy