Question

Je ne sais pas beaucoup sur DDD modèle de référentiel, mais la mise en œuvre au Printemps, c'est la confusion de moi.

public interface PersonRepository extends JpaRepository<Person, Long> { … }

Comme l'interface étend JpaRepository (ou MongoDBRepository...), si vous changez de db à un autre, vous devez changer l'interface.

Pour moi, une interface est là pour apporter un peu d'abstraction, mais ici ce n'est pas tellement abstrait...

Savez-vous pourquoi le Printemps de Données fonctionne comme ça?

Était-ce utile?

La solution

Vous avez raison, une interface est une abstraction sur quelque chose qui fonctionne équivaut à toutes les classes de mise en œuvre, d'un point de vue extérieur.

Et c'est exactement ce qui se passe ici:

  • JParepository est une vue courante de tous vos référentiels JPA (pour toutes les entités différentes), tandis que Mongodbexitory est le même pour toutes les entités MongoDB.
  • mais jParepository and Mongodbexitory n'a rien de commun, à l'exception des choses qui sont définies dans des interfaces Super communes:

    • org.springframework.data.repository.PagingandsortingRepository
    • org.springframework.data.repository.repository

      Alors pour moi, il a l'air normal.

      Si vous utilisez les classes qui implémentent votre référentiel, utilisez la liste de pagination ou le référentiel si vous souhaitez pouvoir passer d'une implémentation de JPA à une implémentation basée sur le document ( désolé mais je ne peux pas imaginer un tel cas d'utilisation - de toute façon ). Et bien sûr, votre implémentation de référentiel doit mettre en œuvre l'interface correcte (JPeePository, MongodbrePository) en fonction de ce qu'il est.

Autres conseils

Le raisonnement derrière cela est assez clairement indiqué dans ce blog post http://blog.springsource.com/2011/02/10/geting-Started-with-spring-Data-jpa/ .

Définition de cette interface sert à deux fins: premièrement, en prolongeant JParePository, nous obtenons un tas de méthodes de crud génériques dans notre type qui permet d'économiser des comptes, de les supprimer, etc. Deuxièmement, cela permettra à l'infrastructure de référentiel JPA de données de ressort de numérisation de la classe de classe pour cette interface et de créer un haricot de ressort.

Si vous ne faites pas confiance aux sources si près de la source (jeu de mots destinée), il serait peut-être une bonne idée de lire ce post aussi HTPTP://www.bruqueursphillips.name/blog/index.cfm/2011/3/25/ULIER- Spring-Data-JPA-to-Data-Access-Coding-Access-Access - .

Ce que je n'avais pas besoin de coder est une implémentation de l'interface personnelleRepository. Le printemps créera une implémentation de cette interface et créera une haricot de dépositaire disponible pour être autonome dans ma classe de services. La haricot de personnageRepository aura toutes les méthodes de CRUD standard (qui seront transactionnelles) et retourneront des objets de la personne ou de la collecte d'objets de personne. Donc, en utilisant des données de printemps jpa, j'ai sauvegardé écrire ma propre classe de mise en œuvre.

Jusqu'M2 de Printemps de Données nous avons demandé aux utilisateurs de s'étendre JpaRepository pour les raisons suivantes:

  1. Le classpath infrastructure d'analyse seulement pris des interfaces de l'extension de cette interface, on peut utiliser Spring Data JPA et le Printemps de Données Mongo en parallèle et ont tous les deux souligné le même paquet, il ne serait pas facile de magasin pour créer le proxy pour.Cependant depuis la RC1 nous laissons simplement que la charge du développeur que nous pensons que c'est plutôt exotique cas et qu'à l'aide de Repository, CrudRepository ou outweights l'effort que vous avez à prendre dans le juste décrit des cas de coin.Vous pouvez utiliser exclude et include les éléments dans l'espace de noms d'acquérir un contrôle plus précis sur ce.
  2. Jusqu'M2 nous avons eu transactionality appliqué les méthodes CRUD par redeclaring les méthodes CRUD, et en annotant avec @Transactional.Cette décision était motivée par l'algorithme AnnotationTransactionAttributeSource utilise pour trouver la configuration de la transaction.Comme nous avons voulu fournir à l'utilisateur la possibilité de reconfigurer les transactions par juste redeclaring un CRUD méthode dans le béton référentiel de l'interface et de l'application de @Transactional sur elle.Pour la RC1, nous avons décidé de mettre en œuvre une coutume TransactionAttributeSource pour être en mesure de déplacer les annotations vers le dépôt CRUD mise en œuvre.

Longue histoire courte, voici ce qu'il se résume à:

Comme de RC1 il n'est pas nécessaire d'étendre le magasin de dépôt interface plus sauf vous souhaitez...

  1. Utilisation Listl'accès aux findAll(…) au lieu de la Iterable-on basé dans la base du référentiel des interfaces (bien que vous pourriez tout simplement redeclare les méthodes pertinentes dans une base commune de l'interface à retour Lists aussi)
  2. Vous souhaitez faire usage de la JPA-méthodes spécifiques comme saveAndFlush(…) et ainsi de suite.

Vous êtes généralement beaucoup plus souple en ce qui concerne l'exposition des méthodes CRUD depuis la RC1, comme vous pouvez même prolonger le Repository marqueur de l'interface et de manière sélective ajouter les méthodes CRUD vous souhaitez exposer.Comme support de la mise en œuvre sera toujours de mettre en œuvre toutes les méthodes de PagingAndSortingRepository on peut encore diriger les appels à l'instance:

public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

  List<T> findAll();

  T findOne(ID id);
}

public interface UserRepository extends MyBaseRepository<User, Long> {

  List<T> findByUsername(String username);
}

Dans cet exemple, nous avons défini MyBaseRepository pour exposer uniquement findAll() et findOne(…) (qui sera acheminée dans l'instance de mise en œuvre les méthodes CRUD) et le béton référentiel ajout d'une méthode de recherche pour les deux CRUD ceux.

Pour plus de détails sur ce sujet, veuillez consulter le la documentation de référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top