对于大型项目,Spring Data JPA 与 Hibernate 有什么不同?

我很难决定是继续使用 Hibernate 开发一个新项目,还是使用 JPA 和新的 Spring Data 实现。

Spring Data 框架是针对大型项目还是只有适度查询需求的小型项目?

虽然我确实看到了使用 @Query注释在代码减少方面的优势,但是您如何处理动态查询呢?如果要实现一个相当复杂的 save ()方法,该怎么办?

文档要求创建一个自定义接口和实现,您的主存储库实现了这些接口和实现,但是如果您需要访问原始存储库本身上的任何超级方法,该怎么办呢?恶劣的存储库实现了定制的存储库,而不是相反的方式。看起来是个奇怪的设计。

我非常不确定这个框架是否能够应对复杂和大型应用程序的挑战。我在使用 Hibernate 时从未遇到过很多问题,我正在考虑坚持使用老式的可靠性,而不是使用 Spring Data JPA。

我应该做什么? 如果我使用 Spring Data JPA,我会遇到什么不可预见的并发症和成本?

78838 次浏览

我已经在具有简单查询要求的小型和大型项目中使用了 Spring Data JPA。主要的优点是甚至不需要使用 @Query注释。Spring Data 中没有任何东西可以阻止您在大型项目中使用它,最近的 QueryDSL支持可能会对您有所帮助。使用 QueryDSL以 Hibernate 为目标的 这是一个例子

如果你预见到复杂的查询,并且你觉得在没有 JPA 的情况下使用 Hibernate 对象很舒服,我认为一个替代的组合可以是简单的 Spring Data Repositorys 和复杂的基于 Hibernate 的 Repositorys,并且提供你可能需要的特定方法。将 Hibernate 实现转换为 Spring Data JPA 结构可能不那么麻烦。

因此,spring-data在处理复杂查询时起到了一些额外的作用。一开始很奇怪,你完全可以在文档中跳过它,但是它真的很强大,很有用。

它包括创建一个定制的 Repository和一个定制的“ RepositoryImpl”,并告诉 Spring 在哪里可以找到它。这里有一个例子:

配置类 -指向仍然需要的 xml 配置,带有指向存储库包的注释(它现在自动查找 *Impl类) :

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

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 站点上。

祝你好运。

SpringJPA 将为您提供大量使用查询方法声明编写 SQL 甚至一些 HQL 的抽象。Spring JPA 的查询生成功能非常出色,但是当您想要一个纯粹的 hibernate 解决方案时,您可以根据需要进行定制,因为 Spring JPA 仍然基于 hibernate。查一下 http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html文件了解更多信息。