Comment Spring Data JPA diffère-t-il d’Hibernate pour les grands projets?

J’ai du mal à décider si je devrais restr avec Hibernate pour un nouveau projet, ou bien me familiariser avec JPA et la nouvelle implémentation de Spring Data.

Le framework Spring Data est-il destiné aux grands projets ou aux petits projets avec des exigences de requête modestes?

Alors que je vois certainement l’avantage de la réduction du code en utilisant l’annotation @Query , que faites-vous pour les requêtes dynamics? Qu’en est-il lorsque vous souhaitez implémenter une méthode save () assez complexe?

La documentation dit de créer une interface et une implémentation personnalisées que votre référentiel principal implémente, mais que se passe-t-il si vous devez accéder à une super méthode du référentiel Crud lui-même? Le référentiel crud implémente celui personnalisé – et non l’inverse. Cela ressemble à un design étrange.

Je ne suis pas certain que ce cadre réponde aux défis des applications complexes et volumineuses. Je n’ai jamais rencontré beaucoup de problèmes avec Hibernate, et j’envisage de restr fidèle au bon vieux plutôt que d’aller avec Spring Data JPA.

Que devrais-je faire? Quelles sont les complications et les coûts imprévus que je rencontrerai si je vais avec Spring Data JPA?

Ainsi, spring-data apporte un peu de magie supplémentaire pour les requêtes complexes. C’est étrange au début et vous le passez complètement dans les docs mais c’est vraiment puissant et utile.

Cela implique de créer un Repository personnalisé et un `RepositoryImpl ‘personnalisé et d’indiquer à Spring où le trouver. Voici un exemple:

Classe de configuration – pointez sur votre configuration XML encore nécessaire avec une annotation pointant vers votre package de référentiels (elle recherche automatiquement les classes *Impl ):

 @Configuration @EnableJpaRepositories(basePackages = {"com.examples.repositories"}) @EnableTransactionManagement public class MyConfiguration { } 

jpa-repositories.xml – Dites à Spring où trouver vos référentiels. CustomImpl également à Spring de rechercher des référentiels personnalisés avec le nom de fichier CustomImpl :

     

MyObjectRepository – vous pouvez y placer des méthodes de requête annotées et non annotées. Notez comment cette interface de référentiel étend celle Custom :

 @Transactional public interface MyObjectRepository extends JpaRepository, MyObjectRepositoryCustom { List findByName(Ssortingng name); @Query("select * from my_object where name = ?0 or middle_name = ?0") List findByFirstNameOrMiddleName(Ssortingng name); } 

MyObjectRepositoryCustom – méthodes de référentiel plus complexes et impossibles à gérer avec une simple requête ou une annotation:

 public interface MyObjectRepositoryCustom { List findByNameWithWeirdOrdering(Ssortingng name); } 

MyObjectRepositoryCustomImpl – où vous implémentez réellement ces méthodes avec un EntityManager automatique:

 public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom { @Autowired private EntityManager entityManager; public final List findByNameWithWeirdOrdering(Ssortingng name) { Query query = query(where("name").is(name)); query.sort().on("whatever", Order.ASC); return entityManager.find(query, MyObject.class); } } 

Étonnamment, tout est réuni et les méthodes des deux interfaces (et de l’interface CRUD que vous implémentez) apparaissent toutes lorsque vous faites:

 myObjectRepository. 

Tu verras:

 myObjectRepository.save() myObjectRepository.findAll() myObjectRepository.findByName() myObjectRepository.findByFirstNameOrMiddleName() myObjectRepository.findByNameWithWeirdOrdering() 

Ça marche vraiment. Et vous obtenez une interface pour interroger. spring-data est vraiment prêt pour une grande application. Et plus vous pouvez envoyer de requêtes simples ou annotées, mieux c’est.

Tout ceci est documenté sur le site Spring Data Jpa .

Bonne chance.

J’ai utilisé Spring Data JPA dans les petits et grands projets avec des requêtes simples. Le principal avantage est de ne pas avoir à utiliser l’annotation @Query . Il n’y a rien dans Spring Data qui vous empêche de l’utiliser dans de grands projets et le récent support de QueryDSL peut vous aider. Ceci est un exemple d’utilisation de QueryDSL pour cibler Hibernate.

Si vous envisagez des requêtes complexes et que vous vous sentez à l’aise avec les objects Hibernate sans JPA, je pense qu’une autre combinaison pourrait consister à disposer d’un simple Repository données Spring à côté des complexes basés sur Hibernate avec les méthodes spécifiques dont vous pourriez avoir besoin. Il serait peut-être moins compliqué de transformer une implémentation d’Hibernate en structure JPA de Spring Data.

Spring JPA vous fournira beaucoup d’abstraction lors de l’écriture de SQL et même de certains HQL en utilisant la déclaration de méthode de requête. Spring JPA brille avec sa génération de requêtes mais lorsque vous voulez une solution purement hibernate, vous pouvez la personnaliser en fonction des besoins, car le JPA du spring est toujours basé sur la mise en veille prolongée. Consultez les documents http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html pour plus d’informations.