it-swarm.com.de

Mehrere Repositorys für dieselbe Entität in Spring Data Rest

Ist es möglich, mit Spring Data Rest zwei verschiedene Repositorys für dieselbe JPA-Entität zu veröffentlichen? Ich habe den beiden Repositorys unterschiedliche Pfade und Rel-Namen gegeben, aber nur eines der beiden ist als REST -Endpunkt verfügbar. Der Punkt, warum ich zwei Repositorys habe, ist, dass eines davon ein Auszug ist, der nur die Grundfelder einer Entität zeigt.

19
Gregor

Der schreckliche Teil ist nicht nur, dass Sie nur 1 Quelldaten-Rest-Repository (@RepositoryRestResource) pro Entität haben können, sondern auch dass, wenn Sie ein reguläres JPA @Repository (wie CrudRepository oder PagingAndSorting) haben, es auch mit der Quelle interagiert Daten ruhen ein (als Schlüssel in der Karte ist die Entität selbst). Verlor einige Stunden beim Debuggen der einen oder anderen zufälligen Last. Ich vermute, wenn dies eine harte Einschränkung der Frühlingsdatenruhe ist, könnte zumindest eine Ausnahme ausgelöst werden, wenn der Schlüssel der Karte bereits vorhanden ist, wenn versucht wird, den Wert zu überschreiben.

10
domgom

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

1
Gregor

Am Ende habe ich mit @Subselect Eine zweite unveränderliche Entität erstellt und diese an das zweite JpaRepsotory gebunden und auf @RestResource(exported = false) gesetzt, was auch zu einer Trennung der Bedenken führt.

Mitarbeiter Beispiel

@Entity
@Table(name = "employee")
public class Employee {

    @Id
    Long id

    String name

    ...

}
@RestResource
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

}
@Entity
@Immutable   
@Subselect(value = 'select id, name, salary from employee')
public class VEmployeeSummary {

    @Id
    Long id

    ...

}
@RestResource(exported = false)
public interface VEmployeeRepository extends JpaRepository<VEmployeeSummary, Long> {

}

Kontext

Zwei Pakete in der monolithischen Anwendung hatten unterschiedliche Anforderungen. Man musste die Entitäten für die Benutzeroberfläche in einem PagingAndSortingRepository mit CRUD-Funktionen verfügbar machen. Die andere war für eine aggregierende Backend-Berichtskomponente ohne Seitenwechsel, aber mit Sortierung.

Ich weiß, dass ich die Ergebnisse aus dem PagingAndSorting-Repository hätte filtern können, nachdem ich Pageable.unpaged() angefordert habe, aber ich wollte nur ein einfaches JPA-Repository, das List für einige Filter zurückgibt.

0

Dies beantwortet die Frage also nicht direkt, kann jedoch zur Lösung des zugrunde liegenden Problems beitragen.

Sie können nur ein Repository pro Entität haben. Sie können jedoch mehrere Entitäten pro Tabelle haben. also mit mehreren Repositorys pro Tabelle.

In ein bisschen Code, den ich geschrieben habe, musste ich zwei Entitäten erstellen ... eine mit einer automatisch generierten ID und eine andere mit einer voreingestellten ID, aber beide zeigen auf dieselbe Tabelle:

@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 die veröffentlichte Ausgabe könnten Sie zwei Entitäten haben. Eine wäre die vollständige Einheit mit Stärken und Stärken für alles. Die andere wäre die Entität, in der es Setter für alles gibt, aber nur Getters für die Felder, die Sie veröffentlichen möchten. Macht das Sinn?

0
JRogerC