JPA面试题及参考答案.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

JPA面试题及参考答案

1.说说JPA和Hibernate的关系?实际项目中怎么选?

答:JPA是Java持久化规范(接口+注解),定义了实体映射、CRUD等标准;Hibernate是JPA的实现之一,还扩展了JPA没有的功能(如拦截器、自定义类型)。

实际项目里,若需跨ORM框架(比如未来可能从Hibernate切到EclipseLink),就按JPA规范写代码;若要用到Hibernate独有的特性(如二级缓存细化配置),也可以直接用HibernateAPI,但要注意耦合度。

2.实体类中@Entity和@Table注解有什么区别?什么场景下必须用@Table?

答:@Entity是声明类为JPA实体(对应数据库表),是必加注解;@Table是可选的,用来指定实体对应的表名、schema、唯一约束等。

必须用@Table的场景:1)实体类名和数据库表名不一致(比如实体叫User,表叫t_user);2)需要设置表的唯一约束(比如@Table(uniqueConstraints=@UniqueConstraint(columnNames=phone)));3)实体对应不同schema的表。

3.JPA主键生成策略有哪些?MySQL用哪种更合适?

答:常用的是GenerationType的4种:

IDENTITY:依赖数据库自增(如MySQL的auto_increment),优势是简单,缺点是批量插入时需先查自增ID,效率稍低;

SEQUENCE:依赖数据库序列(如Oracle的sequence),MySQL不支持序列,所以用不了;

TABLE:用一张中间表模拟序列,所有实体共享或单独用,缺点是并发高时会锁表,性能差,一般不用;

AUTO:让JPA自动选策略,MySQL下会默认用IDENTITY。

MySQL场景优先选IDENTITY,若要批量插入优化,也可以用UUID(@GeneratedValue(generator=uuid)),但要注意UUID作为主键查询效率比自增ID低。

4.实体的持久化状态有哪几种?怎么区分托管状态和游离状态?

答:3种状态:瞬时(Transient)、托管(Managed)、游离(Detached)。

瞬时:new出来的对象,没关联EntityManager,也没主键;

托管:被EntityManager管理的对象(比如em.find()查出来的、em.persist()保存后的),修改后会自动同步到数据库;

游离:曾是托管状态,但EntityManager关闭或clear后,对象有主键但不在EM管理范围内,修改后不会同步数据库。

区分关键:看对象是否在当前EntityManager的管理上下文里——比如em.close()后,之前的托管对象就变游离了;再调用em.merge(游离对象),会重新变成托管。

5.JPQL和SQL的区别是什么?写一个JPQL查询“查询部门ID为1的所有员工,按入职时间倒序”

答:核心区别是JPQL面向实体类(对象),SQL面向数据库表(字段);JPQL不依赖具体数据库,SQL是数据库原生语法。

示例JPQL:

SELECTeFROMEmployeeeWHEREe.department.id=1ORDERBYe.hireDateDESC

注意:这里用的是实体类名Employee、属性名department.id,不是表名t_employee、字段名dept_id。

6.一对多双向关联时,为什么要加mappedBy?不加会有什么问题?

答:mappedBy用来指定“双向关联的主控方”,比如员工(Employee)和部门(Department)是多对一,部门里有个Listemployees,这时要在employees上加@OneToMany(mappedBy=department),表示“由员工的department字段来维护关联关系”。

不加mappedBy会导致双向维护:保存部门时会更新员工表的外键,保存员工时又会更新一次,还可能生成多余的中间表(比如t_department_employees),造成数据冗余和性能问题。

7.什么是懒加载?为什么会出现LazyInitializationException?怎么解决?

答:懒加载是指查询主实体时,不直接加载关联实体,等用到关联实体的属性时才查数据库(比如查部门时,部门里的员工列表默认不查,调用dept.get

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档