Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构

Hibernate与Spring Data JPA:深入解读两大持久化框架的优劣与选择 亲爱的读者,你是否在处理Java应用程序的数据库交互时,曾对选择哪种持久化框架感到困惑?你是否曾对Hibernate和Spring Data JPA之间的关系感到好奇?今天,我将带你深入探索这两个流行的Java持久化框架,帮助你更好地理解它们的优缺点,以及在何种情况下应该选择哪一个。首先,让我们来了解一下Hibernate和Spring Data JPA的基本概念。 阅读详情

大家好,今天,我们将讨论 Hibernate 和 JPA 架构。

在开始我们的文章之前,我想回答一个重要的问题:为什么我们需要使用 Hibernate、Eclipse Link、EF core 等 ORM 工具?

事实上,这是一个非常好的问题。我们开发人员通常有几个月的时间来创建一个新项目,或者有两周的时间来为我们的业务逻辑添加新功能。当我们考虑这个时间表时,为我们的业务逻辑编写 SQL 代码需要花费时间;因此,ORM 工具的创建者认为这将使开发人员的 CRUD 操作更容易。

ORM工具可以防止重复的SQL代码和代码复杂性,并提供代码的可读性和清晰度。

另一方面,生活中每件好事都是有代价的。ORM 工具就是其中之一。不幸的是,我们直到面对结果才意识到我们付出了代价,就像在生活中一样。显然,这些工具在后台执行许多操作,例如映射和转换 SQL 命令。这就是大多数 ORM 工具的性能比本机 SQL 查询更差的原因。

鉴于这些想法,这完全取决于需求。如果您拥有大型系统和复杂关系,则应该选择本机查询。这里的基本问题是您的优先事项是什么?是性能还是清晰度和可读性?

最后,缓存机制是选择 Hibernate 实体缓存的最大原因,它使以数据为中心的应用程序具有高性能,即使应用程序远离数据库。

什么是 Hibernate

Hibernate 是一个 ORM(对象关系映射)工具,它提供了一个框架将 OOP 领域模型映射到 Spring Boot 应用程序中的关系数据库表。

什么是 ORM

ORM 是一种使用 OOP 语言与数据库交互的技术。因此,它简化了创建、读取、更新和删除等不同的数据库操作。

什么是 JPA 和 Spring Data JPA

JPA 是一种从非易失性存储系统中持久保存和检索信息的标准,将 Java 对象映射到数据库中的表。

  • 实体管理器 API 可以从数据库中持久化、更新、检索或删除对象。
  • 实体管理器 API 可以提供 ORM,而无需 JDBC 或 SQL 代码。
  • JPA 提供了一种查询语言,无需编写大量 SQL 查询即可检索对象

Spring Data JPA 使用 JPA 将数据存储在关系数据库中。Hibernate 是 JPA 的实现。

可以使用 Hibernate、Explips Link 或任何其他 JPA 提供程序。Spring Data 不是实现或 JPA 提供程序;它只是一种抽象,可以显著减少样板代码。

JPA不是一个框架。它是一个标准和概念。

 

Hibernate 是 JPA 提供程序,而 Spring Data JPA 不是 JPA 提供程序。它只是一个抽象,可以与 Hibernate、Eclipse Link 等一起使用。

存储库模式

基本上,存储库模式在 BaseRepository 类中管理基本的 CRUD 操作。让我在图中讨论一下这一点。

存储库模式涉及创建一个通用 BaseRepository 接口,其中包含数据库的基本 CRUD 操作。除了此接口之外,还有一个具体的 BaseRepositoryImpl 类,它使用 EntityManager 实现这些操作。

为了对实体执行这些常见操作,我们为 User 实体创建抽象类(如 UserRepository)。这些抽象类定义与实体相关的自定义操作。此外,我们还有具体类(如 UserRepositoryImpl),它们扩展了 BaseRepositoryImpl 和相应的抽象 UserRepository。

这种方法有几个好处。首先,它将常见的数据库操作封装在 BaseRepository 中,从而提高代码重用性和可维护性。其次,通过扩展 UserRepository 等抽象类,我们可以定义实体操作,同时从基础存储库继承通用 CRUD 功能。总体而言,这种结构促进了应用程序内数据库交互的模块化、抽象和高效管理。

让我们看看下面的代码

package com.beratyesbek.basicjparepositorypattern.repository.base;

import com.beratyesbek.basicjparepositorypattern.model.BaseEntity;

import java.util.List;

public interface BaseRepository<E extends BaseEntity, I> {
    void save(E entity);

    void update(E entity, I id);

    List<E> findAll();

    E findById(I id);
}
package com.beratyesbek.basicjparepositorypattern.repository.base;

import com.beratyesbek.basicjparepositorypattern.model.BaseEntity;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


public class BaseRepositoryImpl<E extends BaseEntity, I> implements BaseRepository<E, I> {

    @PersistenceContext
    private  EntityManager entityManager;
    private final Class<E> entityClass;

    public BaseRepositoryImpl(Class<E> entityClass) {
        this.entityClass = entityClass;
    }

    @Override
    @Transactional
    public void save(E entity) {
        entityManager.persist(entity);
    }

    @Override
    @Transactional
    public void update(E entity, I id) {
       E result = entityManager.find((Class<E>) entity.getClass(), id);
       if (result != null) {
           entityManager.merge(result);
       }

    }

    @Override
    @Transactional
    public List<E> findAll() {
        return entityManager.createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e", entityClass).getResultList();
    }

    @Override
    @Transactional
    public E findById(I id) {
        return entityManager.find(entityClass, id);
    }
}

 

package com.beratyesbek.basicjparepositorypattern.repository;

import com.beratyesbek.basicjparepositorypattern.model.User;
import com.beratyesbek.basicjparepositorypattern.repository.base.BaseRepository;


public interface UserRepository extends BaseRepository<User, Integer> {
}
package com.beratyesbek.basicjparepositorypattern.repository;

import com.beratyesbek.basicjparepositorypattern.model.User;
import com.beratyesbek.basicjparepositorypattern.repository.base.BaseRepositoryImpl;
import org.springframework.stereotype.Component;

@Component
public class UserRepositoryImpl extends BaseRepositoryImpl<User, Integer> implements UserRepository{

    public UserRepositoryImpl() {
        super(User.class);
    }
}

JPA 存储库模式

JPA 存储库模式包含使我们更方便的数据库操作。同时,JPA 存储库可以与 Hibernate、Eclipse Link 等配合使用。它只是一个抽象。

JPA 在底层使用了类似的存储库模式。

如您所见,我们有实体,每个实体都有自己的存储库,这些存储库已在后台从 JpaRepository 接口扩展。JPA 存储库与 EntityManager 配合使用,它与 Hibernate 配合使用,后者与 JDBC 配合使用。

Hibernate 具有分层架构,可帮助用户执行操作而无需接触任何底层内容。Hibernate 为持久性服务提供 ORM。

配置对象

通常,配置对象在应用程序生命周期内创建一次;此外,它是第一个创建的 Hibernate 对象。它代表数据库和其他配置。

SessionFactory 对象

SessionFactory 对象是使用配置对象创建的。SessionFactory 对象是一个重量级对象。它通常在应用程序初始化时创建。此外,SessionFactory 是一个线程安全的对象,并由其他线程使用。

会话对象

会话对象用于提供数据库连接。它被设计为轻量级对象,每次需要数据库交互时都会创建它。此外,SessionObject 不建议保留以供以后使用,因为它不是线程安全的。

交易对象

每当我们想要对实体执行操作,根据结果提交或回滚更改时,都会使用 Transaction 对象。

查询对象

查询对象使用 SQL 或 HQL(Hibernate 查询语言)从数据库中检索数据。通过调用属于 Session 对象的 createQuery 方法获取查询实例。

Criteria 对象

它通常使用从 Session 对象获取的动态查询。

休眠代理

休眠涉及两种获取类型的策略:延迟加载和预先加载。

想想看:您有拥有数千个登录历史记录的用户。显然,当您想要从数据库中检索用户时,由于关联的登录历史记录实体,大量数据将付出代价。这就是为什么 Hibernate 使用延迟加载作为默认策略,这意味着检索数据直到需要它为止。这将提高应用程序的性能。Hibernate 使用代理实体来管理这种现象。

总之,Hibernate 代理是一种避免在需要之前检索大量数据的方法。

惰性获取类型

当业务逻辑从数据库加载用户时,JPA 会加载其 ID 名称和电子邮件。但是,登录历史记录仅在调用时加载。如果实体包含如此多涉及大量数据的关系,则 Lazy Fetch 类型将提高应用程序的性能。

即时获取类型

当业务逻辑从数据库加载用户时,JPA 会加载其 ID、姓名、电子邮件以及所有相关实体,例如登录历史记录。这会以牺牲应用程序性能为代价,并且会消耗内存资源。预加载对于一对一实体关系非常有用。

 

Hibernate与Spring Data JPA的区别 在Java开发中,数据持久化是一个重要的环节。为了简化数据库操作,降低与数据库交互的复杂度,出现了多种持久化技术和框架。JPA(Java Persistence API)是Java提供的一种用于管理关系型数据的规范,它定义了一套标准的API和注解,如@Entity@Table@Id等,但本身并不提供具体实现。Hibernate和Spring Data JPA都是围绕JPA发展而来的技术。 阅读详情

相关推荐

告别手动画图!用Cadence SKILL写一个参数化电感PCell(附完整代码)

本文详细介绍了如何使用Cadence SKILL语言开发参数化电感PCell,实现电感版图的自动化生成。通过动态调整线宽、圈数等几何参数,自动创建端口并进行工艺规则校验,大幅提升高频电路设计效率。附完整代码示例,帮助工程师快速掌握PCell开发技巧。

weixin_30684743的博客 366

Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置

一、JPA、Hibernate、Spring Data JPA 的区别与联系 1、什么是 JPA, 它与Hibernate有什么关系? JPA(Java Persistence API):是Java EE 5的标准ORM接口,也是ejb3规范的一部分。可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 JPA为我们提供了以下功能: ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

w风雨无阻w的专栏 8955

头歌 JAVA 桥接模式实验

这样,通过客户端代码配置不同的 FileConvertor 子类和 DataHandler 子类(如 OracleHandler 或 SQLServerHandle),即可实现从不同数据库读取数据并转换成不同格式的功能,而无需修改已有代码。

m0_74091276的博客 3189

Spring Data JPA和Hibernate 之间的关系

JPA JPA 是 Java Persistence API 的简称,中文名 Java 持久层 API,是 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 Sun 引入新的 JPA ORM 规范出于两个原因:其一,简化现有 Java EE 和 Java SE 应用开发工作;其二,Sun 希望整合 ORM 技术,实现天下归一。 JPA 由 EJB 3.0 软件专家组开发,作为 JSR-220 实现的一部分。但它又不限于 EJB 3.0,你可以在 Web 应用

m0_49514150的博客 3655

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案)

本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。

hadoop5ranger的博客 1148

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6217

ORM框架之Spring Data JPA(一)Hibernate实现JPA规范

一、ORM简述 ORM(Object-Relational Mapping) 表示对象关系映射。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射。简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的...

小蜜蜂1010的博客 2389

多臂老虎机——入门强化学习

多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

qq_56683019的博客 2458

主流 ORM 框架架构梳理

本文梳理了主流 ORM 框架的架构层次与核心流程,从 JDBC 规范出发,逐步展开 Hibernate 对 JPA 规范的实现、Spring Data JPA 的 Repository 抽象,以及 MyBatis 从原生 SqlSession 到 Mapper 接口再到 Spring 整合的演变脉络。重点呈现各框架的接口定义、实现类委托及动态代理机制,揭示面向接口编程与分层抽象的核心设计思想,为理解数据库访问框架的封装原理提供清晰的逻辑参考。

2401_88403283的博客 613

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 293

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1597

谈hibernate,jpa与spring data jpa三者之间的关系

前提 其实很多框架都是对另一个框架的封装,我们在学习类似的框架的时候,难免会进入误区,所以我们就应该对其进行总结归纳,对比。 本文就是对hibernate,jpa,spring data jpa三者之间进行文字对比,以及对其三者分别进行CRUD操作。 文字说明 Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建...

qq_41300350的博客 1万+

HighTec安装使用

HighTec安装使用

qq_43552564的博客 3833

Spring Data JPA

快速入门spring data jpa,并且集成到Springboot

llg3189609554的博客 1431

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring Data JPA 之 Hibernate 加载过程与配置项

这⼀讲,我们来分析⼀下在 Spring Data JPA 的项⽬下⾯ Hibernate 的配置参数有哪些,先从 Hibernate 的整体架构进⾏分析。

曾小二的博客 2760

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。 2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和.

wushijuewu 1818

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jpa、hibernate、spring-data-jpa、jdbcTemplate

spring-boot-starter-jdbc也就是创建项目时下图中的JDBC API,也就是JDBCTemplate,提供基础的 Spring 抽象类,包括 DataSource 等,帮助你在 Spring 框架下链接数据库。让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦。

程序员一博 1564

JPA、Hibernate、Spring Data JPA区别

文章目录 JPA、Hibernate、Spring Data JPA 三者的联系和不同: Hibernate is a JPA implementation, while Spring Data JPA is a JPA Data Access Abstraction. With Spring Data, you may use Hibernate, Eclipse Link or any other JPA provider. 上面这张关系图展示了这三者的关系。 JPA(Java Persiste

chenzeyu110的博客 829

【SpringBoot框架篇】11.Spring Data Jpa实战

文章目录简介JPASpring Data JpaHibernateJpa、Spring Data Jpa、Hibernate三者之间的关系应用实战引入依赖配置文件实体类常用注解@Entity和@Table@Id和@GeneratedValue@Column@Transient继承超类的通用字段属性@MappedSuperclass@Inheritance审计功能启用审计功能在启动类里添加注解在需要使用的类上面添加审计监听器审计功能注解添加审计人 简介 首先了解一下 JPA,Spring Data Jpa,之

皓亮君的博客 4337

使用 JPA、Hibernate 和 Spring Data JPA 进行审计

接下来,我们将看看两个提供自己的审计功能的JPA扩展,一个由Hibernate提供,另一个由Spring Data提供。在ORM的上下文中,数据库审计意味着跟踪和记录与持久实体相关的事件,或者只是实体版本控制。对于我们的简单用例,让我们向实体添加两个新属性,因为我们只能管理“实体的非关系状态”。Spring Data JPA是一个框架,通过在JPA提供程序的顶部添加额外的抽象层来扩展JPA。一旦我们创建并将存储库注入另一个组件,Spring Data 将自动提供实现,我们就可以添加审计功能了。

allway2的博客 1514

Spring Boot下的Spring Data JPA实战详解

1.点睛Spring Data JPA(1).什么名字是Spring Data JPA Spring Data JPA是Spring基于Hibernate开发的一个JPA框架,Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量,也就是xml不需要再写很多常规的sql代码了。(2).定义数据访问层

c136547731的博客 2809

JPA、Hibernate、 Spring Data JPA 以及Mybatis的关系(Java)

ORM(Object-Relational Mapping)框架的核心目标是通过对象操作数据库对象与表的映射:自动将对象属性与数据库表的字段关联。SQL 生成:根据对象操作(如保存、查询)自动生成对应的 SQL。关系管理:自动处理对象之间的关联(如一对一、一对多)。典型 ORM 框架:Hibernate、EclipseLink、JPA 实现等。

weixin_45280713的博客 1002

架构师之Spring Data JPA详解

通过本报告,新手可快速掌握 Spring Data JPA 的核心用法,资深开发者可深入原理与调优策略,为构建高效、可维护的数据访问层奠定基础。建议结合电商、社交等实际场景进行项目实战,并持续关注 JPA 生态的新特性

分享技术应用、实践场景等,评论区开放技术难题讨论,共同成长进步。 1444

​ Spring Data JPA

​ 创建一个普通的Maven项目。

埃泽漫笔 1341

MyBatis、MyBatis-Plus、Hibernate、Spring Data JPA 等 Java 持久层技术的理解和对比

Spring Data JPA 、JPA、Hibernate 的关系。默认情况下,它使用的是。作为 JPA 实现。

[ta叫我小白]的专栏 1306
上一篇: 有关异步场景的 10 大 Spring Boot 面试问题
下一篇: 掌握 Spring Boot 中的 WebClient:何时以及为何使用它而不是 RestTemplate
小蜗牛慢慢爬行
博客等级 码龄11年 340粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值