首页 文章

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

提问于
浏览
121

我很难决定是否应该坚持使用Hibernate来完成一个新项目,或者让我对JPA和新的Spring Data实现感到满意 .

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

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

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

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

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

3 回答

  • 4

    我在具有简单查询需求的小型和大型项目中使用了Spring Data JPA . 主要优点是甚至不必使用 @Query 注释 . Spring Data中没有任何内容阻止您在大型项目中使用它,并且最近的 QueryDSL 支持可能对您有所帮助 . This is an example使用QueryDSL来定位Hibernate .

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

  • 99

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

  • 11

    所以, 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 site .

    祝好运 .

相关问题