2012-10-08 43 views
108

Estoy teniendo dificultades para decidir si debo quedarme con Hibernate para un nuevo proyecto, o me mojo los pies con JPA y la nueva implementación de Spring Data.¿En qué se diferencia Spring Data JPA de Hibernate para proyectos grandes?

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

Aunque ciertamente veo la ventaja en la reducción de código al usar la anotación @Query, ¿qué haces para las consultas dinámicas? ¿Qué pasa cuando quieres implementar un método save() que es bastante complejo?

La documentación dice que se debe hacer una interfaz e implementación personalizadas que implemente su repositorio principal, pero ¿qué ocurre si necesita acceder a cualquier supermétodo en el repositorio de crud en sí? El repositorio crud implementa el personalizado, no al revés. Parece un diseño extraño.

No estoy muy seguro de si este marco cubrirá los desafíos de aplicaciones complejas y grandes. Nunca me he encontrado con muchos problemas con Hibernate, y estoy considerando seguir con la buena fiabilidad en lugar de recurrir a Spring Data JPA.

¿Qué debo hacer? ¿Qué complicaciones y costos imprevistos encontraré si uso Spring Data JPA?

+1

Por lo que sé, hace poca diferencia. Ve con el que te sientas más cómodo. ¿Por qué el debate? – duffymo

+1

Obviamente estoy 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 encontraré muchos menos problemas, eso es algo que me gustaría saber. – egervari

+2

JPA es una generalización de ORM que utiliza Hibernate como una de muchas implementaciones. ¿Qué poderes atribuyes a uno sobre el otro? JPA es un estándar, pero veo poca diferencia entre los dos. En aras de una divulgación completa, diré que no me importa ninguno de los dos. Ambos generan SQL para ti. Prefiero escribirlo yo mismo. ORM no es para todos los problemas y para todos los usuarios. – duffymo

Respuesta

91

Por lo tanto, spring-data tiene algo de magia extra que ayuda con las consultas complejas. Es extraño al principio y se salta totalmente en los documentos, pero es realmente poderoso y útil.

Implica crear un Repository personalizado y un `RepositoryImpl 'personalizado y decirle a Spring dónde encontrarlo. He aquí un ejemplo:

clase

Configuración - punto a su configuración XML todavía necesaria con la anotación que apuntan a su paquete de los repositorios (busca *Impl clases ahora automáticamente):

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

JPA-repositorios .xml: indique Spring dónde encontrar sus repositorios. También informe a Spring que busque repositorios personalizados con el nombre CustomImpl 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 usted puede poner anotado y métodos de consulta no anotadas.Nótese cómo se extiende esta interfaz repositorio de la Custom uno:

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

public interface MyObjectRepositoryCustom { 

    List<MyObject> findByNameWithWeirdOrdering(String name); 
} 

MyObjectRepositoryCustomImpl - donde realmente implemente esos métodos con un autoenlace 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, esto todo se junta y los métodos de ambas interfaces (y la interfaz CRUD, que implemento) todos muestran cuando haces:

myObjectRepository. 

Verá:

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

Se realmente funciona Y obtienes una interfaz para consultar. spring-data realmente está listo para una gran aplicación. Y cuantas más consultas pueda ingresar en simples o anotaciones solo obtendrá mejores resultados.

Todo esto está documentado en Spring Data Jpa site.

Buena suerte.

+4

Esto es en realidad lo que probé, y funciona hasta cierto punto. El problema que tuve ¿Qué sucede si desea sobrescribir 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 hace que el Esto es fácil de hacer con Hibernate en bruto, 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 puede hacer con Spring JPA de datos. Creo que me quedaré con Hibernate. Esta respuesta definitivamente ayudará a los demás. – egervari

+8

Puedes implementar tu propio 'JpaRepository' ->' MyJpaRepository'. También debes crear un 'MyJpaRepositoryFactoryBean' pero si lo configuras todo correctamente, puede anular el .sa método ve() Aquí están los documentos JPA de Spring Data: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories No dar hasta ahora! – sbzoom

+0

@Picrochole ¿cómo se interpreta 'nivel inferior de la aplicación'? ¿El servicio llama a DAO en el nivel inferior? – Rumid

9

He usado Spring Data JPA en proyectos pequeños y grandes con demandas simples de consulta. La principal ventaja es no tener que usar la anotación @Query. No hay nada en Spring Data que le impida usarlo en proyectos grandes y la ayuda reciente de QueryDSL podría ayudarlo. This is an example de usar 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 simples Spring Data Repository junto 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 de Spring Data JPA.

+2

. Creo que prefiero usar la misma API uniforme para consultas en lugar de mezclar y combinar en el mismo proyecto. Todavía no he encontrado una buena solución para los datos complejos de jpa de primavera, y ya que hay bastantes nitpicks con jpa que tengo en general, creo que puedo estar más feliz de aceptar hibernate como mi orm. Tendré muchas consultas complejas y no puedo permitirme tener una mezcla 40/60. No me lo merece :( – egervari

+1

También puedes usar Querydsl directamente sin Spring Data, que te proporciona una sola capa de consulta potente sobre JPA. –

2

Spring JPA le proporcionará una gran cantidad de abstracción de 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 quiere una solución puramente hibernada, puede personalizarla según sea necesario ya que el JPA de primavera todavía está basado en la hibernación. Consulte los documentos http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html para obtener más información.

Cuestiones relacionadas