对于大型项目,Spring Data JPA与Hibernate有何不同?
我很难决定是否应该继续使用Hibernate来完成一个新项目,或者使用JPA和新的Spring Data实现我的脚步。
Spring Data框架是否适用于大型项目或小型项目,并且查询要求不高?
尽管我通过使用@Query
注释看到了代码减少的优势,但您对动态查询做了什么? 当你想实现一个非常复杂的save()方法时呢?
该文档说要制作一个定制界面和主存储库实现的实现,但如果您需要访问crud存储库本身的任何超级方法,该怎么办? 粗暴仓库实现了自定义的仓库 - 而不是其他方式。 这似乎是一个奇怪的设计。
我非常不确定这个框架是否能够应对复杂和大型应用的挑战。 我从来没有碰到过很多Hibernate的问题,我正在考虑坚持老的可靠的方法,而不是用Spring Data JPA。
我该怎么办? 如果我使用Spring Data JPA,会遇到哪些无法预料的复杂情况和成本?
因此, spring-data
执行一些额外的功能,以帮助处理复杂的查询。 起初很奇怪,你完全在文档中跳过它,但它非常强大和有用。
它涉及到创建一个自定义的Repository
和一个自定义的`RepositoryImpl',并告诉Spring在哪里找到它。 这里是一个例子:
配置类 - 指向您仍然需要的xml配置,注释指向您的存储库包(它现在会自动查找*Impl
类):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
jpa-repositories.xml - 告诉Spring
哪里可以找到你的仓库。 同时告诉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
- 这是你可以放置带注释和不带注解的查询方法的地方。 请注意,此存储库接口如何扩展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
- 你实际用自动装配的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网站上。
祝你好运。
我已经在具有简单查询需求的小型和大型项目中使用了Spring Data JPA。 主要优势在于甚至不必使用@Query
注释。 Spring Data中没有任何内容阻止您在大型项目中使用它,最近的QueryDSL
支持可能会对您有所帮助。 这是使用QueryDSL来定位Hibernate的一个例子。
如果您预见到复杂的查询,并且您觉得在不使用JPA的情况下使用Hibernate对象会更好,我认为另一种组合可以是使用您可能需要的特定方法在简单的Spring Data Repository
旁边添加复杂的基于Hibernate的数据Repository
。 将Hibernate实现转换为Spring Data JPA结构可能不太麻烦。
Spring JPA将为您提供大量的使用查询方法声明编写SQL甚至某些HQL的抽象。 Spring JPA使用它的查询生成技术,但是当你想要一个纯粹的hibernate解决方案时,你可以根据需要进行定制,因为Spring JPA仍然基于hibernate。 查看文档http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html了解更多信息。
链接地址: http://www.djcxy.com/p/7671.html上一篇: How does Spring Data JPA differ from Hibernate for large projects?