JPA 与 Hibernate 基础与 Hibernate 高级特性

共 43 题
#

1. @Transactional 与事务边界在 JPA 的协作

A 每个 @Transactional 方法都会创建多个独立的持久化上下文
B @Transactional 只负责开启事务,不负责连接管理
C 持久化上下文在事务结束后继续持有数据库连接直到 GC
D 事务结束(提交或回滚)时持久化上下文随之关闭,连接归还连接池 ✓ 正确答案
#

2. @Version 与乐观锁

A @Version 字段在每次读取时都会自增
B 乐观锁通过校验版本号并追加 newVersion 条件实现并发控制 ✓ 正确答案
C 乐观锁在读取数据时就会加锁阻塞其他事务
D @Version 只能使用 Long 类型,不能使用 int
#

3. Hibernate 一级缓存(Session)与二级缓存(SessionFactory)

A 一级缓存是 SessionFactory 级别的,跨 Session 共享
B 一级缓存作用域为当前 Session,二级缓存作用域为 SessionFactory,二者颗粒度不同 ✓ 正确答案
C 二级缓存默认开启,无需任何配置
D 二级缓存是 Session 级别的,事务结束即失效
#

4. Hibernate 的 SQL 日志(hibernate.show_sql/format_sql)与慢查询

A hibernate.format_sql 用于格式化打印的 SQL,便于阅读 ✓ 正确答案
B hibernate.show_sql 生产环境应保持开启以实时监控
C hibernate.use_sql_comments 用于关闭 SQL 日志
D show_sql 的作用是改写 SQL 以提升性能
#

5. Hibernate 的二级缓存(JCache/EhCache/Caffeine)

A JCache 提供统一 API,Hibernate 可通过它接入不同类型的缓存实现 ✓ 正确答案
B 二级缓存默认就启用,无需配置 region factory
C read-only 策略适合频繁修改的数据
D 二级缓存是跨 JVM 的分布式缓存
#

6. 级联(cascade)与孤儿删除(orphanRemoval)的语义

A orphanRemoval=true 表示删除父实体时级联删除所有子实体
B cascade=REMOVE 表示子实体从父集合移除时自动删除
C cascade 与 orphanRemoval 语义完全相同
D orphanRemoval=true 表示子实体从父集合中移除时被自动删除 ✓ 正确答案
#

7. @Convert/AttributeConverter 的自定义类型转换

A convertToDatabaseColumn 用于将实体值转换为数据库列值 ✓ 正确答案
B 一个 @Converter 只能被一个实体引用
C AttributeConverter 是线程不安全的,需要每次 new
D AttributeConverter 只能用于枚举类型
#

8. @Embeddable/@Embedded 的值对象

A @Embedded 必须配合 @AttributeOverride 才能使用
B 值对象拥有独立的数据库主键
C 值对象不能嵌套在其他值对象内
D @Embeddable 值对象没有独立标识,字段随宿主实体映射为同一张表的列 ✓ 正确答案
#

9. @Entity/@Table/@Column 在 Hibernate 7 中命名策略(PhysicalNamingStrategy)的演进

A PhysicalNamingStrategy 只作用于显式指定的 @Column 名称
B Hibernate 7 已移除 PhysicalNamingStrategy
C ImplicitNamingStrategy 负责生成最终物理 SQL 中的表名
D 默认命名策略会把 camelCase 属性名转换为 snake_case 列名 ✓ 正确答案
#

10. @Entity/@Table/@Id/@GeneratedValue 的语义

A SEQUENCE 策略在 MySQL 上性能最优
B TABLE 策略通过数据库序列实现主键
C IDENTITY 策略依靠数据库自增,插入后需立即执行以获取主键 ✓ 正确答案
D AUTO 策略必定使用数据库自增
#

11. @EntityGraph 与抓取策略(FetchType)

A FetchType.EAGER 是默认加载,始终不会产生 N+1 问题
B FetchType.LAZY 在 Session 关闭后仍能正常访问关联
C @EntityGraph 在查询时指定加载路径,可覆盖默认的 FetchType 策略 ✓ 正确答案
D @EntityGraph 只能用于实体上的 @NamedEntityGraph
#

12. @Inheritance 三种策略(SINGLE_TABLE/JOINED/TABLE_PER_CLASS)

A JOINED 策略通过 discriminator 列区分所有子类
B SINGLE_TABLE 策略为每个子类单独建表,查询需 JOIN
C TABLE_PER_CLASS 每个具体类一张表,多态查询通常需要 UNION ALL ✓ 正确答案
D SINGLE_TABLE 策略无法使用 discriminator 列
#

13. @JoinColumn 与 mappedBy 的所有权方向

A mappedBy 标注的一方负责维护外键
B inverse 侧负责保存关联记录
C 双向关联中双方都必须配置 @JoinColumn
D 拥有 @JoinColumn 的一方是维护方,负责更新外键 ✓ 正确答案
#

14. @OneToOne/@OneToMany/@ManyToMany 的关系映射

A @OneToMany 一方总是持有外键列
B @OneToOne 必然使用共享主键
C @ManyToMany 必须在 @JoinTable 中使用集合
D @ManyToMany 通过 @JoinTable 指定中间表来保存关联 ✓ 正确答案
#

15. @Query/@Modifying 与 clearAutomatically

A @Modifying 查询不需要事务支持
B @Modifying 只能用于 SELECT 查询
C clearAutomatically=true 会在修改后清空持久化上下文,避免陈旧实体 ✓ 正确答案
D flushAutomatically 用于关闭自动 flush
#

16. @Where/@Filter 与软删除

A 软删除指的是物理删除数据库记录
B @Where 是运行时动态生效的过滤条件
C @Filter 需要运行时通过 enableFilter 启用,可传参数 ✓ 正确答案
D @Where 只对原生 SQL 生效
#

17. EntityManager 与 EntityManagerFactory 的生命周期

A EntityManagerFactory 重量级且线程安全通常全应用一个,EntityManager 轻量级且线程不安全与事务同生命周期 ✓ 正确答案
B EntityManagerFactory 是线程不安全对象,每个线程各建一个
C EntityManager 是线程安全的,可跨线程共享
D EntityManager 在事务结束后仍可继续使用
#

18. Hibernate 6.x 的 @TenantId 与多租户

A SCHEMA 隔离方式所有租户共享一个 schema
B DISCRIMINATOR 方式每个租户一个独立数据库
C CurrentTenantIdentifierResolver 用于提供数据库连接
D @TenantId 用于标记实体中标识租户的字段,自动填充租户标识 ✓ 正确答案
#

19. Hibernate Statistics(SessionFactory.getStatistics)的应用

A 默认开启,无需配置
B 通过 SessionFactory.getStatistics() 可获取查询次数与缓存命中率等指标 ✓ 正确答案
C 统计信息只能用于实体加载
D Statistics 只能查看 SQL 文本
#

20. Hibernate 与 Spring Data 的 JpaRepository 抽象

A JpaRepository 直接生成 SQL,不依赖 Hibernate
B JpaRepository 继承 CrudRepository 与 PagingAndSortingRepository,底层委托给 EntityManager 执行 ✓ 正确答案
C JpaRepository 只支持自定义 @Query,不支持方法名派生
D JpaRepository 是线程不安全的,每个请求需新建
#

21. Hibernate 的 @DynamicInsert/@DynamicUpdate

A 让 UPDATE 只包含实际变化的字段,生成动态 SQL ✓ 正确答案
B 让 UPDATE 包含全部字段,永不变化
C @DynamicUpdate 默认开启
D @DynamicUpdate 用于控制 INSERT 语句
#

22. Hibernate 的 @Formula/@Generated(计算列)

A @Formula 字段参与持久化,可被写入数据库
B @Formula 通过 SQL 表达式计算只读字段,不参与持久化 ✓ 正确答案
C @Generated 用于让字段在 Java 侧计算
D @Formula 与 @Generated 作用完全相同
#

23. Hibernate 的 @Source/@Target 与软引用映射

A @Source 指定自动生成值的来源(JVM/数据库),@Target 指定属性的实际目标类型 ✓ 正确答案
B 软引用映射用于强制永久保留缓存对象
C @Source 与 @Target 是同一注解的别名
D @Source/@Target 用于内嵌值对象映射
#

24. Hibernate 的 @Subselect 不可变只读映射

A @Subselect 用于定义索引
B @Subselect 将实体映射到物理表
C @Subselect 实体可被正常更新删除
D @Subselect 将实体映射到一段 SQL 子查询,常配合 @Immutable 实现只读映射 ✓ 正确答案
#

25. Hibernate 的 EventListener 与生命周期事件

A @PrePersist 在实体被删除后触发
B @PostLoad 在实体保存时触发
C 生命周期回调不会影响事务
D EventListener 可对会话级事件进行全局拦截扩展 ✓ 正确答案
#

26. Hibernate 的 HQL 与 JPQL 的演进差异

A HQL 是 JPQL 的超集,扩展了 Hibernate 特有功能 ✓ 正确答案
B JPQL 是 Hibernate 的私有语言
C HQL 遵循标准 JPQL,无任何扩展
D HQL 只能查询原生 SQL
#

27. Hibernate 的 HQL 命名参数与位置参数

A 位置参数从 0 开始编号
B 命名参数无法防止 SQL 注入
C 命名参数通过 :name 定义并使用 setParameter 绑定 ✓ 正确答案
D 位置参数绑定不可变
#

28. Hibernate 的 Interceptor/StatementInspector

A StatementInspector 通过 inspect 方法对即将执行的 SQL 进行改写 ✓ 正确答案
B Interceptor 用于改写 SQL 语句
C StatementInspector 面向实体生命周期回调
D 两者作用完全相同
#

29. Hibernate 的 MultiLoad 批量加载

A MultiLoad 只能逐个加载实体
B MultiLoad 每次都会触发全表扫描
C MultiLoad 只支持实体加载,不支持查询
D MultiLoad 通过 byMultipleIds 按主键批量加载,减少 SQL 次数 ✓ 正确答案
#

30. Hibernate 的 NamingStrategy 与物理命名

A ImplicitNamingStrategy 负责最终的物理命名转换
B PhysicalNamingStrategy 处理最终物理命名,默认将 camelCase 转 snake_case ✓ 正确答案
C 显式 @Column 名称完全不受物理策略影响
D NamingStrategy 与 PhysicalNamingStrategy 是同一概念
#

31. Hibernate 的 Session.doWork 与 JDBC 直接调用

A doWork 允许获取当前事务绑定的 JDBC Connection 执行原生操作 ✓ 正确答案
B doWork 用于执行 HQL 查询
C doWork 返回数据库结果集
D doWork 获取的是独立于当前事务的新连接
#

32. Hibernate 的反应式 API(Stage.Session)

A Stage.Session 只能用于原生 SQL
B Stage.Session 是阻塞式 API,与 JDBC 相同
C Stage.Session 提供基于 CompletionStage 的反应式 API ✓ 正确答案
D Stage.Session 与 Mutiny API 完全相同
#

33. Hibernate 的批量抓取(@BatchSize)与 N+1 治理

A @BatchSize 会关闭懒加载
B N+1 问题只发生在多对多关系
C @BatchSize 将懒加载关联的查询合并为批量 in 查询 ✓ 正确答案
D @BatchSize 只能用于实体加载,不能用于集合
#

34. Hibernate 的批量操作(hibernate.jdbc.batch_size)

A 该配置会关闭批量执行
B 该配置只影响 SELECT 查询
C 该配置让 flush 时批量提交 SQL,减少数据库往返 ✓ 正确答案
D 该配置与 IDENTITY 主键完全兼容,无任何限制
#

35. Hibernate 的自定义类型(UserType)

A UserType 允许精细控制属性与数据库列的 JDBC 读写与类型映射 ✓ 正确答案
B UserType 与 AttributeConverter 完全相同
C UserType 只能用于枚举
D UserType 是 JPA 标准提供的最简单类型转换方式
#

36. JPA 3.x 在 Jakarta EE 的演进

A JPA 3.x 仍使用 javax.persistence 包名
B JPA 3.0 将包名从 javax.persistence 迁移到 jakarta.persistence ✓ 正确答案
C Hibernate 6 不兼容 JPA 3.x
D JPA 3.0 移除了所有实体注解
#

37. JPA 与 Hibernate 的关系、ORM 核心概念

A Hibernate 是 JPA 规范的实现,JPA 是标准规范 ✓ 正确答案
B JPA 是 Hibernate 的扩展
C JPA 与 Hibernate 完全独立,无关联
D Hibernate 只支持原生 SQL
#

38. JPQL 与原生 SQL 的取舍

A JPQL 面向实体对象,可移植性好,但无法使用数据库特有语法 ✓ 正确答案
B JPQL 只能用于查询,不能用于更新
C 原生 SQL 号称可移植性最好
D 原生 SQL 与 ORM 缓存完全兼容
#

39. 实体状态(Transient/Persistent/Detached/Removed)

A Persistent 实体在事务提交时变更会被脏检查同步到数据库 ✓ 正确答案
B Transient 实体有数据库标识
C Removed 实体立即被删除,无需提交
D Detached 实体仍被持久化上下文跟踪变更
#

40. Hibernate 6.x 的 SqlExceptionTranslator 与异常体系

A 它只用于 MySQL
B 它将 SQLException 转换为 Spring 的 DataAccessException 体系 ✓ 正确答案
C 它把异常转换为 HTTP 状态码
D 它无法转换 Hibernate 异常
#

41. Hibernate 7 对 JDK 25 虚拟线程与 AOT(JEP 483/514/515)

A Hibernate 7 完全抛弃阻塞式 JDBC,只支持反应式
B 虚拟线程允许阻塞式 JDBC 在线程阻塞时释放载体线程,提升吞吐 ✓ 正确答案
C AOT 编译只影响 SQL 文本
D Hibernate 7 不支持 GraalVM Native Image
#

42. Hibernate 在 GraalVM Native Image 的边界

A Native Image 完全支持运行时反射,无需配置
B Hibernate 无法在原生镜像中使用
C Hibernate 在原生镜像中需提前配置反射/代理元数据或使用编译期字节码增强 ✓ 正确答案
D Native Image 只影响启动速度,不影响功能
#

43. Hibernate 的 ResultTransformer(已弃用)

A 它已被弃用,替代方案是 JPQL 构造器表达式与 JPA 投影 ✓ 正确答案
B 它用于定义数据库索引
C 它只能用于原生 SQL
D 它是 Hibernate 6 推荐的 DTO 映射方式