首页 文章

Spring Data-JPA与JPA:有什么区别?

提问于
浏览
123

我对Spring Data-JPA和JPA之间的区别感到有点困惑 . 我知道JPA它是使用流行的ORM技术将Java对象持久化到关系数据库的规范,即换句话说,JPA提供接口和其他ORM技术,实现称为JPA提供者的接口,例如Hibernate .

现在究竟什么是Spring Data JPA . Spring Data JPA是否在JPA上增加了一些功能(接口),仍然只是指定它还是JPA提供者?

我看到Spring Data JPA围绕存储库工作(DAO层:如果我没有错) . 所以我的意思是使用'Spring Data JPA Hibernate'或仅使用'Hibernate'指导它有什么不同?

3 回答

  • 111

    我看到Spring,JPA围绕存储库工作(DAO层:如果我没有错) . 所以我的意思是使用'Spring JPA Hibernate'或者直接使用'Hibernate'是多么不同?

    如您所述, JPA 是规范,而 Hibernate 是该规范的特定实现(这些实现通常称为提供者) . 通过使用Hibernate,您可以将自己绑定到该提供程序,从而限制您在需要时切换到另一个选项的自由(例如,您希望使用EclipseLink或ObjectDB,因为Hibernate有一个停止开发过程的错误) .

    引用 Spring Data JPA's 文件:

    在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦 . 必须编写太多的样板代码 . 域类是贫血的,并没有以真实的面向对象或域驱动的方式设计 . 使用这两种技术可以使开发人员在富域模型的持久性方面更加轻松 . 尽管如此,实现存储库的样板代码量仍然很高 . 因此,Spring Data的存储库抽象的目标是减少为各种持久性存储实现数据访问层的工作量 .

    总而言之,它是在JPA之上添加另一层抽象,类似于定义基于标准的设计以支持Spring上下文中的持久层 . 这些定义的接口(Spring知道)提供框架使用JPA处理结果的服务 . 您可以通过Spring扫描项目并找到它来定义存储库:

    <repositories base-package="com.acme.repositories" />
    

    因此,允许您在容器的上下文中或在容器的外部使用它 .

    现在Spring究竟是什么,JPA . 是Spring,JPA在JPA上增加了一些功能(接口),仍然只是指定它还是JPA提供者?

    Spring Data JPA提供了一个定义,通过引用JPA规范,使用您定义的提供程序来实现支持的存储库 .

  • 29

    Java Persistence API,有时也称为JPA,是一个Java框架,用于管理使用Java平台,标准版(JavaSE)和Java平台企业版(JavaEE)的应用程序中的关系数据 .

    Persistence in this context covers three areas:

    • API本身,在 javax.persistence 包中定义 .

    • Java持久性查询语言(JPQL) .

    • 对象关系元数据 .

    enter image description here

    Spring Data JPA是Spring Data项目的一部分,可以更轻松地实现基于JPA的存储库 .

    Features:

    • 基于Spring和JPA构建存储库的复杂支持

    • 支持QueryDSL谓词,从而支持类型安全的JPA查询

    • 透明审核域类

    • 分页支持,动态查询执行,集成自定义数据访问代码的能力

    • 在引导时验证 @Query 带注释的查询

    • 支持基于XML的实体映射

    通过引入 @EnableJpaRepositories

    • 基于JavaConfig的存储库配置

    enter image description here

  • 1

    Spring Data JPA提供了黑盒子 - org.springframework.data.repository类 . 并非所有方法都暴露在这里 . 当你需要做一些复杂的事情时,这是一个限制 . 典型的JPA是开放的 - 你可以决定如何使用Entity Manager,例如在你的Dao中创建一些神奇的例程 .

    您可以将Daobab(http://www.daobab.io)放在这两种技术上 . Daobab提供Java和JPA之间的集成,例如:

    List<String> names=Select.fieldList(daoPizza.colName())
    	.where(daoPizza.colPizzaId(),Operator.GREATER_THAN,5).result();
    

    它适用于SprinDataJPA和纯JPA(Hibernate) . 这就是框架差异对你来说不重要的原因 .

相关问题