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

2022-08-31 08:30:36

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

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

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

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

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

我该怎么办?如果我使用Spring Data JPA,我会遇到哪些不可预见的复杂情况和成本?


答案 1

因此,做了一些额外的魔术,有助于复杂的查询。起初它很奇怪,你在文档中完全跳过它,但它真的很强大和有用。spring-data

它涉及创建自定义和自定义“RepositoryImpl”,并告诉Spring在哪里可以找到它。下面是一个示例:Repository

配置类 - 指向您仍然需要的 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网站上

祝你好运。


答案 2

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

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


推荐