我很难决定是否应该在新项目中坚持使用 Hibernate,还是应该使用 JPA 和新的 Spring Data 实现。
Spring Data 框架是针对大型项目还是针对查询要求不高的小型项目?
虽然我确实看到了使用 @Query
注释在减少代码方面的优势,但您如何处理动态查询?当你想实现一个相当复杂的 save() 方法时怎么办?
文档说要创建一个自定义接口和实现,你的主存储库实现了,但是如果你需要访问 crud 存储库本身的任何超级方法怎么办? 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
文件名的自定义存储库:
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 site 中。
祝你好运。
我在具有简单查询需求的小型和大型项目中使用了 Spring Data JPA。主要优点是甚至不必使用 @Query
注释。 Spring Data 中没有任何内容可以阻止您在大型项目中使用它,QueryDSL
最近的支持可能会对您有所帮助。 This is an example 使用 QueryDSL 来定位 Hibernate。
如果您预见到复杂的查询,并且在没有 JPA 的情况下使用 Hibernate 对象感觉很舒服,我认为另一种组合可能是将简单的 Spring Data Repository
放在具有您可能需要的特定方法的复杂的基于 Hibernate 的对象旁边。将 Hibernate 实现扭曲成 Spring Data JPA 结构可能不那么麻烦。
Spring JPA 将为您提供大量使用查询方法声明编写 SQL 甚至一些 HQL 的抽象。 Spring JPA 以其查询生成而大放异彩,但是当您想要一个纯粹的休眠解决方案时,您可以根据需要进行自定义,因为 Spring JPA 仍然基于休眠。查看文档 http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html 了解更多信息。
不定期副业成功案例分享
JpaRepository
->MyJpaRepository
。您还必须创建一个MyJpaRepositoryFactoryBean
但如果您正确设置它,您可以覆盖 .save() 方法。这是 Spring Data JPA 文档:static.springsource.org/spring-data/data-jpa/docs/current/… 不要放弃!