Le meilleur moyen de traiter les entités de l'héritage du Printemps de Données JPA
J'ai trois entité JPA classes A
, B
et C
avec la hiérarchie suivante:
A
|
+---+---+
| |
C B
Qui est:
@Entity
@Inheritance
public abstract class A { /* ... */ }
@Entity
public class B extends A { /* ... */ }
@Entity
public class C extends A { /* ... */ }
À l'aide de Spring Data JPA, quelle est la meilleure façon de les écrire dépôts classes pour de telles entités?
Je sais que je peux écrire ces:
public interface ARespository extends CrudRepository<A, Long> { }
public interface BRespository extends CrudRepository<B, Long> { }
public interface CRespository extends CrudRepository<C, Long> { }
mais si dans la classe A
il y a un champ name
et j'ajoute cette méthode dans le ARepository
:
public A findByName(String name);
J'ai à écrire une telle méthode aussi dans les deux autres référentiels, et c'est un peu ennuyeux.. Est-il une meilleure façon de gérer une telle situation?
Un autre point que je voudrais avoir, c'est que ARespository
devrait être un dépôt en lecture seule (c'est à dire étendre la Repository
classe) tandis que les deux autres référentiels devraient exposer toutes les opérations CRUD.
Laissez-moi savoir les solutions possibles.
- Vous pouvez écrire résumé public Un findByName(String nom), de sorte que toutes les sous-classes doivent implémenter cette méthode.
- mais je ne veux pas mettre en œuvre une telle méthode (Spring Data JPA le faire pour moi, avec un peu de magie 🙂 ).. je serait la définir dans un seul endroit, comme dans le
ARespository
.. - Une chose que j'ai trouvé avec des dépôts est que l'héritage dans les entités ne dicte pas d'héritage dans les référentiels. Alors qu'une Banane est un des Fruits, un BananaBox n'est pas un FruitBasket. Façon de parler. J'ai eu plus de succès en ayant la BananaRepo utiliser un FruitRepo au travers de la composition, accéder simplement à des fins de A la
SELECT
partie de la requête, et B remplissage de la base de Fruits-les propriétés de la Banane qui vient d'être instancié. Vous devriez vérifier si c'est possible avec le Printemps, bien que.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé la solution décrite dans ce post de Netgloo blog.
L'idée est de créer un générique référentiel de la classe comme suit:
alors je peux écrire les trois pôles de cette façon:
En outre, pour obtenir un dépôt en lecture seule pour
ARepository
je peux définir laABaseRepository
en lecture seule:et de
BRepository
étendre également au Printemps de Données JPA estCrudRepository
pour avoir un accès en lecture/écriture du référentiel: