java - Spring Data JPA 和 Hibernate
问题描述
Spring Data JPA 不是 JPA 实现,它是对数据库数据访问的抽象。在与 JPA 的实现(比如 Hibernate)进行比较的领域中,我无法理解这个表达式。使用 Spring Data JPA 时,要使用 CRUD 操作,您必须从 CrudRepository 接口扩展。但是没有 Hibernate,Spring Data JPA 不能独立工作,因为它不能将 java 对象转换为实体。但!Hibernate 也可以执行 CRUD 操作。所以问题是: 1. 如果我们仍然需要使用 HIBERNATE,为什么开发人员使用 Spring Data JPA(准确地说是 CRUD 操作)?2. CrudRepository 接口只是一个接口,它是从“Repository”接口扩展而来的。我们在 CRUD 类中对其进行扩展以实现 CRUD 操作。我不明白它是如何工作的。我们的类如何能够简单地通过扩展接口来执行 CRUD 操作。没有实现的方法。 我现在该如何回答这些问题:
- 是为了简化代码。由于通过 Hibernate 使用 CRUD 操作需要更多代码。
- 目前,脑海中只有一些想法,即以某种(“神奇的”)方式,CrudRepository 接口使用标准的 Hibernate 工具来使用 CRUD 操作。
解决方案
JPA 是一种规范,它指定了一组标准的类、方法、注释、约定等,用于将 Java 对象映射到关系数据库。
Hibernate 是本规范的实现之一。它实现了 JPA 规范中定义的所有内容。
Spring Data JPA 是一个使用 JPA 的框架,因此需要 JPA(Hibernate 或任何其他)的实现才能使用。它是建立在标准 JPA 规范之上的抽象层。
如果我们仍然需要使用 HIBERNATE,为什么开发人员使用 Spring Data JPA(精确的 CRUD 操作)?
因为 Spring-Data-JPA 使得在 Spring 应用程序中使用 JPA 变得容易,并且更容易定义存储库:所有基本操作,如果您不使用 Spring-Data-JPA,通常必须手动编写, 框架已经为您实现了。它基于约定和声明性查询,为您实现方法,这使事情变得更快、更安全、编写起来更简单。
我不明白它是如何工作的。我们的类如何简单地通过扩展接口来执行 CRUD 操作
它使用动态代理:在运行时,它使用反射来检查存储库接口中定义的所有附加方法,并创建一个动态代理,即实现该接口并使用标准 JPA API 实现接口中定义的方法的类. 这是一个比较高级的话题。谷歌“Java 动态代理”让您入门。但是您也可以只使用框架而无需自己编写,就像您使用计算机而不了解电子设备的工作原理一样。
推荐阅读
- node.js - Mongoose 填充模式返回未定义
- python - 如何在 Django 中将注册用户添加到用户模型(在身份验证和授权部分)?
- java - EditText 上的事件根本没有触发
- php - 如何将实体查询结果作为对象获取
- java - “ro.product.cpu.abilist”还能在哪里更改?
- javascript - IntersectionObserver:rootMargin 是如何工作的?
- r - 边或顶点动态属性的子图
- c# - 使用 .net/c# 通过代理连接到 Watson DiscoveryService
- c# - WPF MVVM:根据另一个数据网格的选定项更新数据网格
- reactjs - 如何在其他函数中使用函数的变量?