版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JPA面试题及详细答案(实战接地气版)一、基础认知类(入门必问)1、说说你对JPA的理解?JPA和Hibernate的关系是什么?答案:JPA不是框架,是Java官方的ORM规范、接口标准,定义了对象操作数据库的统一规则,比如实体注解、CRUD接口、查询规范等,本身没有具体实现。Hibernate是JPA最主流的实现框架。简单说:JPA是标准,Hibernate是实现。我们开发中常用的SpringDataJPA,是Spring基于JPA规范再次封装的工具,简化了数据库操作,底层默认还是依赖Hibernate实现。2、JPA、MyBatis、SpringDataJPA三者的区别和适用场景?答案:MyBatis:半ORM框架,需要自己写SQL,灵活度高,适合复杂查询、多表关联、频繁优化SQL的业务,比如报表、复杂统计、老旧系统改造。缺点是简单CRUD代码冗余。原生JPA:纯ORM规范,面向对象操作数据库,不用写SQL,适合简单业务、快速开发。缺点是复杂查询、动态条件拼接比较麻烦。SpringDataJPA:在JPA基础上封装,极致简化开发,自带CRUD方法、方法名自动生成SQL、分页排序,适配绝大多数常规业务。缺点是特殊复杂SQL还是需要手写。日常开发选型:简单业务、快速迭代用SpringDataJPA;复杂查询、需要精细控制SQL用MyBatis。3、JPA常用的核心实体注解有哪些?分别作用?答案:@Entity:标记当前类为数据库实体类,被JPA托管。@Table(name="xxx"):映射对应的数据库表名,实体类名和表名不一致时必须指定。@Id:标记主键字段。@GeneratedValue:主键生成策略,搭配@Id使用。@Column:映射表字段,可设置长度、是否非空、唯一、字段名映射。@Transient:临时字段,不映射数据库表字段,仅用于业务传输。@Temporal:日期类型映射,指定是DATE、TIME还是TIMESTAMP。@Enumerated:枚举类型映射数据库字段。4、JPA主键生成策略有哪几种?各自区别?答案:通过@GeneratedValue(strategy=)指定,常用四种:IDENTITY:数据库自增,依赖数据库自增主键,MySQL常用,插入数据后才会生成主键。AUTO:默认策略,JPA自动根据数据库选择策略,MySQL走自增,Oracle走序列。SEQUENCE:序列生成主键,Oracle、PostgreSQL常用,需要手动创建序列。TABLE:用一张专门的表维护主键,兼容性好,但性能最差,基本不用。实际开发MySQL项目,基本都是用IDENTITY。二、SpringDataJPA核心用法1、SpringDataJPA的核心接口有哪些?继承关系?答案:继承层级从顶层到底层:Repository:顶层父接口,空接口,标识作用,所有持久层接口的父类。CrudRepository:继承Repository,提供基础CRUD方法,无分页功能。PagingAndSortingRepository:继承CrudRepository,新增分页、排序功能。JpaRepository:继承PagingAndSortingRepository,功能最全,新增批量操作、刷新缓存、批量删除等方法,开发中基本都继承这个接口。2、SpringDataJPA有几种查询方式?答案:四种常用方式,开发中混合使用:1、默认自带方法:save、findById、findAll、deleteById等,无需手写。2、方法名命名查询:按照JPA规则定义方法名,框架自动解析生成SQL,比如findByUsername、findByAgeGreaterThan。简单条件查询首选,不用写SQL。3、@JPQL查询:写面向实体的查询语句,操作的是实体名和属性,不是表名和字段,支持复杂条件、关联查询。4、@NativeQuery原生SQL查询:直接写数据库原生SQL,适合复杂统计、特殊语法、函数查询。3、讲讲JPA方法名查询的常用关键字?答案:日常高频使用,不用写SQL,直接定义方法名即可:等值:findByXXX、readByXXX、getByXXX模糊:Like、NotLike范围:GreaterThan、LessThan、Between空判断:IsNull、IsNotNull包含:In、NotIn排序:OrderByXXXDesc/OrderByXXXAsc去重:Distinct示例:List<User>findByAgeBetweenAndUsernameLike(Integermin,Integermax,Stringname);4、JPQL和原生SQL的区别?答案:JPQL:面向对象查询,语句中写的是实体类名、属性名,不是表名字段名,语法通用,跨数据库适配性好,不用改代码切换数据库。不支持数据库专属函数、特殊语法。原生SQL:面向数据库表,写真实表名、字段名,支持所有数据库函数、特殊语法,查询效率可控,但跨数据库兼容性差,数据库切换需要改SQL。三、JPA核心原理与生命周期1、JPA实体的四种状态?分别是什么场景?答案:这是JPA核心重点,所有增删改查都围绕实体状态流转:瞬时态(临时态):new出来的实体对象,没有被持久化、没有存入缓存、数据库无对应数据,和JPA上下文无关。持久态:实体被JPA托管,存在于一级缓存中,数据库有对应记录。持久态实体自动更新,不用手动调用save,修改属性后事务提交自动同步数据库。游离态:数据库有对应数据,但当前实体不在JPA缓存中,脱离托管。修改游离态实体属性,不会自动更新数据库。删除态:执行delete方法后,实体标记为删除,事务提交后会从数据库删除。2、JPA一级缓存和二级缓存的区别?默认开启哪个?答案:一级缓存(Session缓存):默认开启,不可关闭。作用域是当前事务/当前会话,同一个事务内,多次查询同一数据,只会查一次数据库,后续从缓存取。事务结束后缓存清空。二级缓存:默认关闭,需要手动配置。作用域是全局、跨会话、跨事务,所有请求共享缓存,适合查询频繁、修改少的静态数据,比如字典、配置。日常开发基本只用一级缓存,二级缓存很少用,容易出现数据脏读问题。3、为什么持久态实体修改属性不用save也能更新数据库?答案:JPA事务提交时,会触发脏数据检查机制。当前事务内的持久态实体,会和一级缓存中快照数据对比,如果属性发生变化,JPA会自动生成update语句,同步到数据库,不需要手动调用save方法。这也是JPA开发的特点,但如果不注意,容易出现无意更新字段的问题。四、关联关系(高频面试重点)1、JPA四种关联关系及实际业务场景?答案:一对一@OneToOne:用户和用户详情、员工和工号,一一对应。一对多@OneToMany:部门和员工、订单和订单明细,一个主体对应多个子数据。多对一@ManyToOne:员工归属部门、订单归属用户,多个数据对应一个主体,开发中最常用。多对多@ManyToMany:用户和角色、角色和权限,互相多对多关联。2、mappedBy关键字的作用?什么时候用?答案:mappedBy用来指定关联关系的维护方,放弃当前实体的外键维护权。举个例子:部门和员工一对多,外键在员工表。员工(多的一方)是关系维护方,负责维护外键;部门(一的一方)是被动方,需要在@OneToMany上加mappedBy="dept",表示放弃维护,避免JPA重复生成中间表、报错。核心规则:外键在哪张表,哪张表就是关系维护方,另一方加mappedBy。3、fetch加载策略LAZY和EAGER区别?答案:EAGER(立即加载):查询当前实体时,立刻查询关联数据,一次性加载所有关联对象。优点是使用方便,缺点是数据量大时查询冗余、性能差。@ManyToOne默认EAGER。LAZY(延迟加载):查询当前实体时,不加载关联数据,只有调用关联属性时,才会查询数据库。性能更好,避免多余查询。@OneToMany、@ManyToMany默认LAZY。开发中优先使用延迟加载,提升查询性能。4、什么是懒加载异常(LazyInitializationException)?怎么解决?答案:异常原因:事务已经关闭、Session已经销毁,此时去访问延迟加载的关联属性,没有数据库会话支撑,直接报错。常见解决方案:业务层查询时,通过joinfetch主动抓取关联数据;开启OpenSessionInView(不推荐,有性能隐患);按需设置加载策略,不滥用懒加载;DTO分层,查询后立即封装数据,不在事务外访问关联属性。五、事务与批量操作1、JPA事务默认传播机制和隔离级别?答案:传播机制默认REQUIRED:有事务就加入,没有就新建事务。隔离级别默认和数据库一致:MySQL默认可重复读(RR)。2、JPAsave方法是新增还是修改?底层怎么判断?答案:JPA的save方法是新增/更新合并方法,底层判断逻辑:如果实体主键为null/主键不存在:执行insert新增;如果实体主键有值:执行select查询,判断数据库是否存在数据,存在则update更新,不存在则insert。所以批量操作时直接save性能差,因为会多一次查询,推荐用saveAll批量保存,或者原生批量SQL。3、JPA批量更新、删除需要注意什么?答案:JPA的批量update、delete属于直接操作数据库,不会更新一级缓存,会导致缓存和数据库数据不一致,出现脏数据。解决方案:批量操作后,手动clear缓存、refresh刷新实体,或者直接避免批量操作后再查询同一事务内的数据。六、性能优化与实战踩坑(面试加分项)1、JPA常见性能问题有哪些?答案:N+1查询问题:查询主数据1次,循环遍历每条数据的关联对象,额外发起N次查询,导致查询次数暴增。懒加载滥用:事务外访问关联数据报错,或频繁触发延迟查询。save方法冗余查询:主键有值时先查后改,浪费性能。不使用分页查询:findAll查询全表数据,数据量大时内存溢出。动态条件拼接麻烦:硬写多个方法,代码冗余。2、怎么解决JPA的N+1问题?答案:实战常用三种方案:JPQL中使用joinfetch关联抓取,一次性查询主数据和关联数据,只查1次库;使用@EntityGraph指定需要加载的关联字段,提前抓取;避免循环内查询数据库,批量查询、一次性封装数据。3、JPA分页查询有什么坑?怎么解决?答案:默认的Page分页会执行两条SQL:一条查分页数据,一条count统计总数,大数据量、复杂查询时count语句极慢。优化方案:不需要总数时,使用Slice分页,不执行count查询,性能更高;复杂查询手写countSQL,自定义分页;对count字段建立索引。4、JPA和MyBatis相比,最大的短板是什么?答案:复杂查询、多表嵌套、复杂统计、自定义SQL场景下不够灵活,自动生成的SQL有时候冗余、低效,无法精细化优化SQL。所以企业开发中一般简单CRUD用JPA,复杂查询用MyBatis,两者搭配使用。七、高频手写面试题1、手写一个SpringDataJPA分页+条件查询示例答案:java
//1、持久层接口
publicinterfaceUserRepositoryextendsJpaRepository<User,Long>{
//条件分页查询
Page<User>findByUsernameLikeAndStatus(Stringusername,Integerstatus,Pageablepageable);
}
//2、业务层调用
Pageablepageable=PageRequest.of(0,10,Sort.by(Sort.Direction.DESC,"createTime"));
Page<User>userPage=userRepository.findByUsernameLikeAndStatus("%"+name+"%",1,pageable);
/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山东省安丘市高三生物下册期末考试模拟考试卷(含答案)
- 2026年江苏省海门市高三历史上册期末考试自测卷及参考答案(基础题)
- 2026年其他知识竞赛-6S管理知识竞赛历年参考题库含答案解析
- 2026年上海住院医师-上海住院医师急诊科历年参考题库含答案解析
- 2026山西省卫生系统招聘考试(临床医学)历年参考题库含答案详解
- 2026山西机关事业单位工人技术等级考试(汽车驾驶员·高级)历年参考题库含答案详解
- 2026山东省高职院校单独招生考试(文化素质)历年参考题库含答案详解
- 2026山东教师招聘考试(综合应用能力)历年参考题库含答案详解
- 2026天津教育系统招聘考试(辅导员综合知识)历年参考题库含答案详解
- 2026天津卫生系统招聘考试(眼科专业知识)历年参考题库含答案详解
- 2026国家司法考试试题及答案
- 2026年中国钢研科技集团有限公司人员招聘考试备考试题及答案详解
- 第8课《中国人失掉自信力了吗》课件 2026-2027学年统编版语文九年级上册
- 赓续红色血脉 走好新时代长征路-纪念中国工农红军长征胜利90周年大会发言稿
- 中药药剂学习题集全(修改版)
- 2026中国高原地区特种无人机研发与极端环境测试评估报告
- 《低空经济概论》课件 学习情境6 低空经济政策法规与标准体系
- 2026年广东省学法考试年度考试(考场一)参考答案
- 2026秋新教材人教PEP版六年级上册英语Unit 4 Managing money well教案(单元整体教学设计)
- 2026年二建《水利水电》真题答案及解析(完整版)
- 2026年脑血管介入考试题及答案
评论
0/150
提交评论