Spring Data JPA与大型项目的Hibernate有何不同?

我很难决定是否应该继续使用Hibernate来完成一个新的项目,或者使用JPA和新的Spring Data实现。

Spring Data框架是否适用于大型项目或具有适度查询要求的小型项目?

虽然我通过使用@Query注释当然看到了代码减less的优势,但是您对dynamic查询做了什么? 当你想要实现一个相当复杂的save()方法时呢?

该文档说,要做一个自定义的接口和实现,你的主存储库实现,但如果你需要访问任何超级方法的crud存储库本身? 粗暴仓库实现了自定义的一个 – 而不是其他的方式。 这似乎是一个奇怪的devise。

我非常不确定这个框架是否能够应对复杂和大型应用的挑战。 我从来没有遇到过许多与Hibernate有关的问题,我正在考虑坚持老的可靠,而不是用Spring Data JPA。

我该怎么办? 如果我使用Spring Data JPA,会遇到什么样的无法预料的复杂性和成本?

所以, spring-data做一些额外的function,帮助处理复杂的查询。 起初很奇怪,你完全可以在文档中跳过它,但它确实是强大而有用的。

它涉及到创build一个自定义的Repository和一个自定义的`RepositoryImpl',并告诉Spring在哪里find它。 这里是一个例子:

configuration类 – 指向你仍然需要的xmlconfiguration ,注释指向你的仓库包(它现在自动寻找*Impl类):

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

jpa-repositories.xml – 告诉Spring哪里可以find你的仓库。 同时告诉Spring使用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 – 这是你可以把注释和unannotated查询方法。 请注意,这个存储库接口如何扩展Custom

 @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 – 更复杂的存储库方法,不能用简单的查询或注释处理:

 public interface MyObjectRepositoryCustom { List<MyObject> findByNameWithWeirdOrdering(String name); } 

MyObjectRepositoryCustomImpl – 你实际上用自动assembly的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); } } 

令人惊讶的是,这一切都汇集在一起​​,并且当你这样做的时候,来自两个接口(和你实现的CRUD接口)的方法都显示出来:

 myObjectRepository. 

你会看见:

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

它确实工作。 你会得到一个查询界面。 spring-data真的为大型应用程序做好了准备。 而更多的查询,你可以推入简单或注释只有你越好。

所有这些都在Spring Data Jpa网站上有logging 。

祝你好运。

我使用Spring Data JPA来处理简单查询需求的小型和大型项目。 主要优点是甚至不必使用@Query注释。 Spring Data中没有任何内容阻止您在大型项目中使用它,最近的QueryDSL支持可能会对您有所帮助。 这是使用QueryDSL来定位Hibernate的一个例子 。

如果您预见到复杂的查询,并且您觉得在不使用JPA的情况下使用Hibernate对象会更好,那么我认为一个可选的组合可以是使用您可能需要的特定方法将简单的Spring Data Repository放在复杂的基于Hibernate的Spring Data Repository旁边。 将Hibernate实现转换成Spring Data JPA结构可能不那么麻烦。

Spring JPA将为您提供很多从编写SQL甚至使用查询方法声明的一些HQL的抽象。 Spring JPA闪耀着它的查询生成function,但是当你想要一个纯粹的hibernate解决scheme时,你可以根据需要进行定制,因为Spring JPA仍然基于hibernate。 查看文档http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html了解更多信息。;