ege*_*ari 127 java spring hibernate jpa spring-data-jpa
我很难决定是否应该坚持使用Hibernate来完成一个新项目,或者尝试使用JPA和新的Spring Data实现.
Spring Data框架是针对具有适度查询要求的大型项目还是小型项目?
虽然我通过使用@Query注释确实看到了减少代码的优势,但您对动态查询有何看法?当你想要实现一个非常复杂的save()方法时呢?
文档说明要创建主存储库实现的自定义接口和实现,但是如果需要访问crud存储库本身的任何超级方法呢?crud存储库实现了自定义存储库 - 而不是相反.这似乎是一个奇怪的设计.
我很不确定这个框架是否能够应对复杂和大型应用程序的挑战.我从未遇到过Hibernate的许多问题,而且我正在考虑坚持使用旧的可靠而不是使用Spring Data JPA.
我该怎么办?如果我使用Spring Data JPA,我会遇到哪些无法预料的并发症和成本?
sbz*_*oom 103
那么,spring-data是否有一些额外的魔法可以帮助复杂的查询.一开始很奇怪,你完全在文档中跳过它,但它确实非常强大和有用.
它涉及创建一个自定义Repository和自定义`RepositoryImpl'并告诉Spring在哪里找到它.这是一个例子:
配置类 - 指向仍然需要的xml配置,注释指向您的存储库包(它*Impl现在自动查找类):
@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
MyObjectRepositoryCustom - 更复杂且无法使用简单查询或注释处理的存储库方法:
public interface MyObjectRepositoryCustom {
List<MyObject> findByNameWithWeirdOrdering(String name);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这一切都汇集在一起,来自两个接口(以及您实现的CRUD接口)的方法都会在您执行时显示:
myObjectRepository.
Run Code Online (Sandbox Code Playgroud)
你会看见:
myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Run Code Online (Sandbox Code Playgroud)
它确实有效.你得到一个查询界面.spring-data真的已经为大型应用做好了准备.而且你可以将更多的查询推送到简单或注释中,只有你越好.
所有这些都记录在Spring Data Jpa站点上.
祝好运.
mad*_*th3 12
我在具有简单查询要求的小型和大型项目中使用了Spring Data JPA.主要优点是甚至不必使用@Query注释.Spring Data中没有任何内容阻止您在大型项目中使用它,并且最近的QueryDSL支持可能对您有所帮助.这是使用QueryDSL来定位Hibernate 的示例.
如果您预见到复杂的查询,并且您觉得在没有JPA的情况下使用Hibernate对象感觉很舒服,我认为另一种组合可能是将简单的Spring Data放在Repository复杂的基于Hibernate的对象旁边,并使用您可能需要的特定方法.将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了解更多信息。
| 归档时间: |
|
| 查看次数: |
76059 次 |
| 最近记录: |