129

我很难决定是否应该在新项目中坚持使用 Hibernate,还是应该使用 JPA 和新的 Spring Data 实现。

Spring Data 框架是针对大型项目还是针对查询要求不高的小型项目?

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

文档说要创建一个自定义接口和实现,你的主存储库实现了,但是如果你需要访问 crud 存储库本身的任何超级方法怎么办?crud 存储库实现了自定义存储库 - 而不是相反。这似乎是一个奇怪的设计。

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

我该怎么办?如果我使用 Spring Data JPA,我会遇到哪些不可预见的并发症和成本?

4

3 回答 3

105

所以,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- 您实际使用 autowired 实现这些方法的地方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 站点上

祝你好运。

于 2012-10-09T18:56:08.937 回答
12

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

如果您预见到复杂的查询,并且在没有 JPA 的情况下使用 Hibernate 对象感觉很舒服,我认为另一种组合可能是将简单的 Spring Data 放在Repository复杂的基于 Hibernate 的旁边,并使用您可能需要的特定方法。将 Hibernate 实现扭曲成 Spring Data JPA 结构可能不那么麻烦。

于 2012-10-09T00:50:29.917 回答
4

Spring JPA 将为您提供大量使用查询方法声明编写 SQL 甚至一些 HQL 的抽象。Spring JPA 以其查询生成而大放异彩,但是当您想要一个纯粹的休眠解决方案时,您可以根据需要进行自定义,因为 Spring JPA 仍然基于休眠。查看文档http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html了解更多信息。

于 2015-08-12T06:35:52.437 回答