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

3ks5zfa0  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(113)

我很难决定我是应该在新项目中坚持使用Hibernate,还是应该用JPA和新的Spring Data实现。
SpringData框架适用于大型项目还是查询需求适中的小型项目?
虽然我确实看到了使用@Query注解在减少代码量方面的优势,但是对于动态查询应该怎么做呢?当您想要实现一个相当复杂的保存()方法时又该怎么做呢?
文档中说要定制一个主仓库实现的接口和实现,但是如果你需要访问crud仓库本身的超级方法怎么办?crud仓库实现了定制的接口和实现,而不是相反。这看起来是一个奇怪的设计。
我很不确定这个框架是否能满足复杂和大型应用程序的挑战,我从来没有遇到过Hibernate的很多问题,我正在考虑坚持使用可靠的老框架,而不是Spring Data JPA。
我应该怎么做?如果我使用Spring Data JPA,我会遇到什么不可预见的复杂情况和成本?

okxuctiv

okxuctiv1#

所以,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站点上进行了记录。

bmp9r5qi

bmp9r5qi2#

我在具有简单查询需求的小型和大型项目中使用过Spring Data JPA。主要的优点是甚至不必使用@Query注解。Spring Data中没有任何东西阻止您在大型项目中使用它,最近的QueryDSL支持可能会帮助您使用QueryDSL来定位Hibernate。
如果您预见到了复杂的查询,并且您觉得使用Hibernate对象而不使用JPA很舒服,我认为一种替代组合可能是在复杂的基于Hibernate的查询旁边使用简单的Spring Data Repository,并使用您可能需要的特定方法。将Hibernate实现扭曲到Spring Data JPA结构中可能会更方便。

brccelvz

brccelvz3#

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

相关问题