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

ege*_*ari 127 java spring hibernate jpa spring-data-jpa

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

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

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

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

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

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

sbz*_*oom 103

那么,spring-data是否有一些额外的魔法可以帮助复杂的查询.一开始很奇怪,你完全在文档中跳过它,但它确实非常强大和有用.

它涉及创建一个自定义Repository和自定义`RepositoryImpl'并告诉Spring在哪里找到它.这是一个例子:

配置类 - 指向仍然需要的xml配置,注释指向您的存储库包(它*Impl现在自动查找类):

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

MyObjectRepositoryCustom - 更复杂且无法使用简单查询或注释处理的存储库方法:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这一切都汇集在一起​​,来自两个接口(以及您实现的CRUD接口)的方法都会在您执行时显示:

myObjectRepository.
Run Code Online (Sandbox Code Playgroud)

你会看见:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()
Run Code Online (Sandbox Code Playgroud)

它确实有效.你得到一个查询界面.spring-data真的已经为大型应用做好了准备.而且你可以将更多的查询推送到简单或注释中,只有你越好.

所有这些都记录在Spring Data Jpa站点上.

祝好运.

  • 您可以实现自己的`JpaRepository` - >`MyJpaRepository`.你还必须创建一个`MyJpaRepositoryFactoryBean`但如果你正确设置它,你可以覆盖.save()方法.这是Spring Data JPA Docs:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories不要给刚刚起来! (8认同)
  • 这实际上是我尝试过的,它在某种程度上起作用.如果你想覆盖save(),我遇到的问题是什么?例如,假设您正在保存博客,并且您希望在save()方法中处理/保存与其关联的标记,因为将其放入服务中并不是最有意义的.使用原始Hibernate很容易做到这一点,但我没有看到使用Spring JPA的好方法.我打算将你的答案标记为正确但是因为它是正确的.这基本上就是你可以用Spring Data JPA做的.我想我会坚持使用Hibernate.这个答案肯定会帮助别人. (4认同)

mad*_*th3 12

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

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

  • 我想我宁愿在查询中使用相同的一致api,而不是在同一个项目中混合和匹配.我仍然没有找到一个很好的解决方案来处理复杂的弹簧数据jpa的东西,并且因为我总体上有很多jpa的淘汰器,我想我可能会更乐意接受hibernate作为我的orm.我会有很多复杂的查询,而且我不能承受40/60的混合.这对我来说不值得:( (2认同)

F.O*_*O.O 5

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