# 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 映射方式