2016-03-20 20 views
14

È possibile pubblicare due repository diversi per la stessa entità JPA con Spring Data Rest? Ho dato ai due repository diversi percorsi e nomi rel, ma solo uno dei due è disponibile come endpoint REST. Il punto per cui ho due repository è che uno di essi è un estratto, che mostra solo i campi base di un'entità.Repository multipli per la stessa entità in Spring Data Rest

+1

Questo non è possibile. Con Spring Data REST una risorsa gestita è un'entità non un repository. La libreria mantiene una 'Mappa' di risorse gestite dove la chiave è la classe di entità. Pertanto, l'entità può essere mappata su una sola interfaccia di repository alla volta (poiché una 'Mappa 'può contenere solo un valore per una chiave). Se è fondamentale che l'applicazione abbia più repository per classe di entità, è possibile che si desideri sollevare una richiesta di miglioramento con il team Spring Data. – manish

+0

Ci sono MultiMap. Tecnicamente non c'è sicuramente nessun ostacolo. Da un punto di vista semantico, nei nostri casi d'uso, una risorsa non può essere identificata con un'entità ma piuttosto con una vista, nel senso di un DB. Le viste corrispondono alle proiezioni in Spring Data Rest. Quindi sarebbe bello poter mappare le Proiezioni e le operazioni su di esse alle risorse. – Gregor

+0

Il mio commento era basato sulla [effettiva implementazione REST di Spring Data] (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). So che esistono strutture come 'MultiMap', motivo per cui ho suggerito di prendere in considerazione una richiesta di miglioramento con il team Spring Data. – manish

risposta

1

La risposta sembra essere: esiste un solo repository possibile per entità.

8

La parte terribile è non solo che si può avere solo 1 dei dati di primavera repository riposo (@RepositoryRestResource) per entità, ma anche che se si dispone di un regolare JPA @Repository (come CrudRepository o PagingAndSorting) sarà anche interagire con i dati primaverili ne riposano uno (come la chiave nella mappa è l'Entità stessa). Ha perso un bel po 'di ore nel debugging del carico casuale dell'uno o dell'altro. Immagino che se questa è una dura limitazione dei dati primaverili, almeno un'eccezione potrebbe essere generata se la chiave della mappa è già presente quando si tenta di sovrascrivere il valore.

+0

Ho creato un problema con Jira per questo: https://jira.spring.io/browse/DATAREST-923 sentitevi liberi di votarlo! – Tim

+0

Quale sarebbe un buon caso per cui sono necessari due repository? Esempio di utilizzo – Tim

+0

: archiviare in JPA + utilizzare il repository Elasticsearch per la ricerca – aux

0

Quindi, questo non risponde direttamente alla domanda, ma può aiutare a risolvere il problema sottostante.

È possibile avere un solo repository per entità ... tuttavia, è possibile avere più entità per tabella; quindi, avendo più repository per tabella.

In un po 'di codice che ho scritto, ho dovuto creare due entità ... uno con un id generato automaticamente e un altro con un ID della preselezione, ma entrambi puntano allo stesso tavolo:

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

    ... 
} 

Quindi, avevo un repository per ciascuno:

public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> { 

    ... 

} 


public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> { 

    ... 

} 

Per il problema pubblicato, si potevano avere due entità. Uno sarebbe l'entità completa, con getter e setter per tutto. L'altra, sarebbe l'entità, dove ci sono setter per tutto, ma solo getter per i campi che vuoi rendere pubblici. Ha senso ciò?