web-dev-qa-db-fra.com

Plusieurs référentiels pour la même entité dans Spring Data Rest

Est-il possible de publier deux référentiels différents pour la même entité JPA avec Spring Data Rest? J'ai attribué aux deux référentiels des chemins d'accès et des noms de noms différents, mais un seul des deux est disponible en tant que noeud final REST. La raison pour laquelle j'ai deux référentiels, c'est que l'un d'entre eux est un extrait, montrant uniquement les champs de base d'une entité.

19
Gregor

La partie terrible n’est pas seulement que vous ne pouvez avoir qu’un seul référentiel de données de printemps (@RepositoryRestResource) par entité, mais aussi que si vous avez un JPA @Repository régulier (comme CrudRepository ou PagingAndSorting), il interagira également avec le printemps. données restantes (car la clé sur la carte est l’entité elle-même). Perdu quelques heures de débogage charge aléatoire de l'un ou l'autre. J'imagine que s'il s'agit d'une limitation difficile du repos des données de printemps, au moins une exception peut être levée si la clé de la carte est déjà présente lors de la tentative de substitution de la valeur.

10
domgom

La réponse semble être la suivante: il n'y a qu'un seul référentiel possible par entité.

1
Gregor

Donc, cela ne répond pas directement à la question, mais peut aider à résoudre le problème sous-jacent.

Vous ne pouvez avoir qu'un seul référentiel par entité ... Cependant, vous pouvez avoir plusieurs entités par table. ainsi, avoir plusieurs référentiels par table.

Dans un peu de code que j'ai écrit, je devais créer deux entités: une avec un identifiant généré automatiquement et une autre avec un identifiant prédéfini, mais les deux pointant vers la même table:

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

    ...
}

Ensuite, j'ai eu un dépôt pour chacun:

public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> {

    ...

}


public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> {

    ...

}

Pour le problème publié, vous pouvez avoir deux entités. L'une serait l'entité complète, avec des getters et des setters pour tout. L'autre serait l'entité, où il y a des installateurs pour tout, mais seulement des accesseurs pour les champs que vous voulez rendre publics. Est-ce que ça a du sens?

0
JRogerC