En quoi Spring Data JPA diffère-t-il D'Hibernate pour les grands projets?

J'ai du mal à décider si je devrais rester avec Hibernate pour un nouveau projet, ou me mouiller les pieds avec JPA et la nouvelle implémentation de données Spring.

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

Bien que je vois certainement l'avantage de la réduction de code en utilisant l'annotation @Query, Que faites-vous pour les requêtes dynamiques? Qu'en est-il lorsque vous voulez 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 faire si vous avez besoin d'accéder à des super méthodes sur le référentiel crud lui-même? Le référentiel crud implémente le référentiel personnalisé-pas l'inverse. Cela semble être un design étrange.

Je suis très incertain si ce cadre répondra aux défis des applications complexes et de grande envergure. Je n'ai jamais rencontré beaucoup de problèmes avec Hibernate, et j'envisage de coller avec le bon vieux fiable plutôt que d'aller avec Spring Data JPA.

Que dois-je faire? Quelles complications et quels coûts imprévus vais-je rencontrer si je vais utiliser Spring Data JPA?

120
demandé sur Kevin Panko 2012-10-09 03:24:41

3 réponses

Donc, spring-data fait de la magie supplémentaire qui aide avec des requêtes complexes. C'est étrange au début et vous l'ignorez totalement dans les docs mais c'est vraiment puissant et utile.

Cela implique de créer un Repository personnalisé et un 'RepositoryImpl' personnalisé et de dire à Spring où le trouver. Voici un exemple:

Classe de Configuration - pointez vers votre configuration xml toujours nécessaire avec une annotation pointant vers votre paquet de dépôts (il recherche automatiquement les classes *Impl maintenant):

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

JPA-dépôts.xml - dire Spring où trouver vos dépôts. Dites également à Spring de rechercher des référentiels personnalisés avec le nom de fichier CustomImpl:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository - c'est là que vous pouvez mettre des méthodes de requête annotées et non annotées. Notez comment cette interface de référentiel étend le Custom Un:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - les méthodes de référentiel qui sont plus complexes et ne peuvent pas être gérées avec une simple requête ou annotation:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

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

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

Étonnamment, tout cela se réunit et les méthodes des deux interfaces (et de L'interface CRUD, que vous implémentez) apparaissent toutes quand vous le faites:

myObjectRepository.

, Vous verrez:

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 les requêtes que vous pouvez pousser dans simple ou annotation seulement le mieux vous vous trouvez.

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

Bonne chance.

98
répondu sbzoom 2018-05-31 10:55:13

J'ai utilisé Spring Data JPA dans de petits et grands projets avec des requêtes simples. Le principal avantage est de ne même pas avoir à utiliser l'annotation @Query. Rien dans Spring Data ne vous empêche de l'utiliser dans de grands projets et le support récent de QueryDSLpourrait vous aider. Ceci est un exemple d'utilisation deQueryDSL pour cibler Hibernate.

Si vous prévoyez des requêtes complexes et que vous vous sentez à l'aise d'utiliser des objets Hibernate sans JPA, je pense qu'une alternative la combinaison pourrait être d'avoir les données de printemps simples Repository à côté des données complexes basées sur Hibernate avec les méthodes spécifiques dont vous pourriez avoir besoin. Il pourrait être moins lourd que de tordre une implémentation Hibernate dans la structure Spring Data JPA.

11
répondu madth3 2012-10-10 07:47:37

Spring JPA vous fournira beaucoup d'abstraction de L'écriture de SQL et même de 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 personnaliser au besoin car spring JPA est toujours basé sur hibernate. Vérifiez les documents http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html pour plus d'informations.

4
répondu F.O.O 2015-08-12 06:35:52