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.
InformationsquelleAutor Andrea | 2014-12-18