我很难决定是否应该在新项目中坚持使用 Hibernate,还是继续使用 JPA 和新的 Spring Data 实现。
Spring Data 框架适用于大型项目还是具有适度查询要求的小型项目?
虽然我确实看到了使用 @Query
注释在代码缩减方面的优势,但您如何处理动态查询?当你想实现一个相当复杂的 save() 方法时怎么办?
文档说要创建一个自定义接口(interface)和实现,您的主存储库实现,但是如果您需要访问 crud 存储库本身的任何 super 方法怎么办? 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
- 这是您可以放置带注释和未注释查询方法的地方。请注意此存储库接口(interface)如何扩展 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
- 您实际使用 Autowiring 的 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);
}
}
令人惊讶的是,这一切都汇集在一起,当您这样做时,来自两个接口(interface)(以及您实现的 CRUD 接口(interface))的方法都会显示出来:
myObjectRepository.
你会看到:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
确实有效。您将获得一个查询界面。 spring-data
确实为大型应用程序做好了准备。而且,您可以推送到简单或注释的查询越多,您的情况就越好。
所有这些都记录在 Spring Data Jpa site .
祝你好运。
关于java - 对于大型项目,Spring Data JPA 与 Hibernate 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790853/