¿En qué se diferencia Spring Data JPA de Hibernate para proyectos grandes?

129

Me está costando decidir si debería seguir con Hibernate para un nuevo proyecto o mojarme los pies con JPA y la nueva implementación de Spring Data.

¿El marco de Spring Data está destinado a proyectos grandes o pequeños con requisitos de consulta modestos?

Si bien ciertamente veo la ventaja en la reducción de código mediante el uso de la @Queryanotación, ¿qué haces para las consultas dinámicas? ¿Qué pasa cuando quieres implementar un método save () que es bastante complejo?

La documentación dice hacer una interfaz personalizada e implementación que implemente su repositorio principal, pero ¿qué sucede si necesita acceder a algún método súper en el repositorio de Crud? El repositorio crud implementa el personalizado, no al revés. Parece un diseño extraño.

No estoy seguro de si este marco responderá a los desafíos de las aplicaciones complejas y grandes. Nunca he tenido muchos problemas con Hibernate, y estoy considerando seguir con el viejo y confiable en lugar de ir con Spring Data JPA.

¿Qué tengo que hacer? ¿Qué complicaciones y costos imprevistos enfrentaré si uso Spring Data JPA?

egervari
fuente
1
Hasta donde yo sé, hace poca diferencia. Ve con el que te resulte más cómodo. ¿Por qué el debate?
duffymo
1
Obviamente estoy mucho más cómodo con Hibernate, pero si puedo hacer las mismas cosas y ser más productivo, prefiero adoptar los enfoques más nuevos. Sin embargo, si Hibernate es aún más poderoso y voy a encontrar muchos menos problemas, eso es algo que me gustaría saber.
egervari
3
JPA es una generalización de ORM que usa Hibernate como una de las muchas implementaciones. ¿Qué poderes le estás atribuyendo a uno sobre el otro? JPA es un estándar, pero veo poca diferencia entre los dos. En aras de la divulgación completa, diré que no me importa ninguno de los dos. Ambos generan SQL para usted. Prefiero escribirlo yo mismo. ORM no es para todos los problemas y todos los usuarios.
duffymo
1
Estoy de acuerdo. Cuando se trata solo de JPA o Hibernate, elegiría Hibernate cada vez. Sinceramente, no me gusta mucho la implementación de JPA por sí sola. El soporte de IDE en IDEA todavía es bastante malo, y se quejará si las asignaciones no son correctas cuando se inicia la aplicación en lugar de dejar que se ejecuten las pruebas unitarias. Hay muchos otros nitpicks que tengo con JPA. De hecho, disfruto los viejos archivos de mapeo XML de Hibernate. Tiene la ventaja de hacer que mis objetos se vean mucho menos desordenados también. Spring Data JPA ofrece muchas características nuevas, por lo que finalmente me preguntaba si vale la pena cambiar.
egervari
3
"Spring Data" no es una implementación de JPA, ni nada. Simplemente toma una implementación JPA existente y simplifica lo que le proporciona. La implementación de JPA todavía hace todo el trabajo oculto
Neil Stockton el

Respuestas:

104

Entonces, spring-data hace un poco de magia extra que ayuda con consultas complejas. Al principio es extraño y lo omites por completo en los documentos, pero es realmente poderoso y útil.

Implica crear una costumbre Repository 'RepositoryImpl' y personalizado y decirle a Spring dónde encontrarlo. Aquí hay un ejemplo:

Clase de configuración: señale su configuración xml aún necesaria con una anotación que apunte a su paquete de repositorios (ahora busca *Implclases automáticamente):

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

jpa-repositories.xml: indica Springdónde encontrar tus repositorios. También indique Springque busque repositorios personalizados con el CustomImplnombre del archivo:

<?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- Aquí es donde puede colocar métodos de consulta anotados y no anotados. Tenga en cuenta cómo esta interfaz de repositorio extiende el Customuno:

@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 - métodos de repositorio que son más complejos y no se pueden manejar con una simple consulta o anotación:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- donde realmente implementa esos métodos con un autoconectado 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);
    }
}

Sorprendentemente, todo esto se combina y los métodos de ambas interfaces (y la interfaz CRUD que implementa) se muestran cuando lo hace:

myObjectRepository.

Ya verás:

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

Realmente funciona. Y obtienes una interfaz para realizar consultas.spring-dataRealmente está listo para una gran aplicación. Y cuantas más consultas pueda enviar a simples o anotaciones, mejor será.

Todo esto está documentado en el sitio Spring Data Jpa .

Buena suerte.

sbzoom
fuente
44
Esto es realmente lo que probé, y funciona hasta cierto punto. El problema que tuve es ¿qué pasa si desea anular save ()? Por ejemplo, imagine que está guardando un blog, y desea procesar / guardar las etiquetas asociadas con él en el método save (), ya que ponerlo en un servicio no tiene más sentido. Esto es fácil de hacer con Hibernate sin procesar, pero no veo una buena manera de hacerlo con Spring JPA. Sin embargo, voy a marcar su respuesta como correcta porque es correcta. Eso es básicamente lo que puedes hacer con Spring Data JPA. Sin embargo, creo que me quedaré con Hibernate. Esta respuesta definitivamente ayudará a otros.
egervari
8
Puede implementar su propio JpaRepository-> MyJpaRepository. También debe crear un MyJpaRepositoryFactoryBeanpero, si lo configura todo correctamente, puede anular el método .save (). Aquí están los documentos de Spring Data JPA: static.springsource.org/spring-data/data-jpa/docs/current/… ¡ No te rindas todavía!
sbzoom
@Picrochole, ¿cómo interpreta usted 'nivel inferior de aplicación'? ¿Es el servicio, que llama a DAO más bajo en el nivel?
Rumid
12

He usado Spring Data JPA en proyectos pequeños y grandes con demandas de consultas simples. La principal ventaja es que ni siquiera tiene que usar la @Queryanotación. No hay nada en Spring Data que le impida usarlo en proyectos grandes y el QueryDSLsoporte reciente podría ayudarlo. Este es un ejemplo del uso de QueryDSL para apuntar a Hibernate.

Si prevé consultas complejas y se siente cómodo utilizando objetos de Hibernate sin JPA, creo que una combinación alternativa podría ser tener los Spring Data simples Repositoryjunto a los complejos basados ​​en Hibernate con los métodos específicos que pueda necesitar. Puede ser menos engorroso que torcer una implementación de Hibernate en la estructura JPA de Spring Data.

madth3
fuente
2
Creo que preferiría usar la misma API consistente para consultas, en lugar de mezclar y combinar en el mismo proyecto. Todavía no he encontrado una buena solución para las cosas complejas de datos de primavera jpa, y dado que hay bastantes trampas con jpa que tengo en general, creo que podría estar más feliz de aceptar hibernar como mi orm. Tendré muchas consultas complejas, y no puedo permitirme tener una mezcla 40/60. No vale la pena para mí :(
egervari
1
También puede usar Querydsl directamente sin Spring Data, que le brinda una única capa de consulta potente sobre JPA.
Timo Westkämper
4

Spring JPA le proporcionará mucha abstracción al escribir SQL e incluso algo de HQL utilizando la declaración del método de consulta. Spring JPA brilla con su generación de consultas, pero cuando desea una solución puramente de hibernación, puede personalizarla según sea necesario, ya que spring JPA todavía se basa en hibernación. Consulte los documentos http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html para obtener más información.

FOO
fuente