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


129

我很难决定是应该坚持使用Hibernate进行新项目,还是选择JPA和新的Spring Data实现。

Spring Data框架适用于查询需求适中的大型项目还是小型项目?

虽然我当然看到了通过使用@Query注释在代码减少方面的优势,但是您对动态查询做了什么?当您要实现一个非常复杂的save()方法时该怎么办?

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

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

我该怎么办?如果使用Spring Data JPA,我会遇到哪些无法预见的复杂性和成本?


1
据我所知,这没有什么区别。选择一个您更习惯的。为什么要辩论?
duffymo

1
显然,我对Hibernate感到更自在,但是如果我能做同样的事情并提高生产力,我宁愿采用更新的方法。但是,如果Hibernate仍然强大,并且我遇到的问题要少得多,那么这就是我想知道的事情。
egervari

3
JPA是ORM的概括,它使用Hibernate作为许多实现之一。您将一种力量赋予另一种力量?JPA是一个标准,但是我发现两者之间没有什么区别。为了充分公开,我会说我不在乎任何一个。两者都为您生成SQL。我宁愿自己写。ORM并非针对每个问题和每个用户。
duffymo

1
我同意。仅涉及JPA或Hibernate时,我每次都会选择Hibernate。老实说,我不太喜欢JPA实施。实际上,IDEA中对IDE的支持仍然很糟糕,它将在应用程序启动而不是让单元测试运行时抱怨映射是否不正确。JPA还有很多其他的优点。我实际上喜欢旧的Hibernate XML映射文件。它具有使我的对象看起来也不太混乱的优点。Spring Data JPA提供了许多新功能,所以我终于想知道是否值得切换。
egervari

3
“ Spring Data”不是JPA或其他任何实现。它仅需要一个现有的JPA实现,并简化了您提供给它的内容。JPA实施仍在幕后进行所有工作
Neil Stockton

Answers:


104

因此,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-您实际使用自动装配实现这些方法的位置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站点上

祝好运。


4
这实际上是我尝试过的,并且在某种程度上有效。我遇到的问题是,如果您想覆盖save()?例如,假设您正在保存一个博客,并且想要在save()方法中处理/保存与之关联的标签,因为将其放入服务中没有任何意义。使用原始Hibernate可以很容易地做到这一点,但是我看不到使用Spring JPA的好方法。我会将您的答案标记为正确,因为它是正确的。基本上,这就是使用Spring Data JPA可以执行的操作。我想我会坚持使用Hibernate。这个答案肯定会帮助别人。
egervari

8
您可以实现自己的JpaRepository-> MyJpaRepository。您还必须创建一个,MyJpaRepositoryFactoryBean但是如果正确设置了所有内容,则可以覆盖.save()方法。这是Spring Data JPA文档:static.springsource.org/spring-data/data-jpa/docs/current / ...不要放弃!
sbzoom 2012年

@Picrochole您如何解释“应用程序的较低层”?服务,将DAO称为较低层吗?
鲁米德'17

12

我已经在具有简单查询需求的小型和大型项目中使用了Spring Data JPA。主要优点是无需使用@Query注释。Spring Data中没有什么可以阻止您在大型项目中使用它,而最近的QueryDSL支持可能会为您提供帮助。这是使用QueryDSL定位休眠的示例

如果您预见到复杂的查询,并且在不使用JPA的情况下使用Hibernate对象感到很自在,我认为另一种组合可能是将简单的Spring Data Repository与基于Hibernate的复杂Spring 并排,并使用您可能需要的特定方法。将Hibernate实现转换为Spring Data JPA结构可能并不那么麻烦。


2
我想我宁愿使用相同的一致api进行查询,而不是在同一项目中进行混合和匹配。对于复杂的spring数据jpa东西,我仍然没有找到一个好的解决方案,并且由于我总体上有很多使用jpa的nitpicks,我想我可能更乐于接受休眠作为我的orm。我将有很多复杂的查询,而且我负担不起40/60的混合比例。这对我来说不值得:(
egervari

1
您也可以直接使用Querydsl,而无需使用Spring Data,它在JPA之上为您提供了一个强大的查询层。
2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.