题目
Hibernate 实体类主键生成策略配置
信息
- 类型:问答
- 难度:⭐
考点
主键生成策略,注解配置,基础映射
快速回答
在 Hibernate 中配置主键生成策略的主要方式:
- 使用
@Id注解标记主键字段 - 通过
@GeneratedValue注解指定生成策略 - 常用策略:
GenerationType.IDENTITY(数据库自增)、GenerationType.SEQUENCE(序列)、GenerationType.AUTO(自动选择) - 示例配置:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
原理说明
Hibernate 主键生成策略决定了实体对象持久化时主键值的产生方式。通过 @GeneratedValue 注解配置,Hibernate 会根据策略与数据库交互生成唯一标识符,确保数据完整性。
代码示例
import javax.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // MySQL 自动增长主键
private String name;
private double price;
// 构造方法/getters/setters
}常见生成策略对比
| 策略类型 | 适用场景 | 数据库支持 |
|---|---|---|
GenerationType.IDENTITY | 依赖数据库自增字段 | MySQL(AUTO_INCREMENT), SQL Server(IDENTITY) |
GenerationType.SEQUENCE | 使用数据库序列 | Oracle, PostgreSQL |
GenerationType.TABLE | 模拟序列(通用但效率低) | 所有数据库 |
GenerationType.AUTO | 自动选择(默认策略) | 根据数据库方言决定 |
最佳实践
- 优先选择 IDENTITY/SEQUENCE:性能优于 TABLE 策略
- 明确指定策略:避免依赖 AUTO 的不可控行为
- 数值型主键:推荐使用 Long 类型避免溢出
- 组合注解配置序列(Oracle示例):
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seq_gen")
@SequenceGenerator(name="seq_gen", sequenceName="product_seq")
private Long id;
常见错误
- 忘记 @GeneratedValue:导致插入时需手动设置主键
- 策略与数据库不匹配:如对 MySQL 使用 SEQUENCE 策略
- 非空约束冲突:未配置生成策略时插入 null 值
- 类型不匹配:数据库字段类型与 Java 类型不一致
扩展知识
- 自定义生成器:实现 IdentifierGenerator 接口创建定制策略
- UUID 主键:使用
@GeneratedValue(generator = "uuid")+@GenericGenerator(name="uuid", strategy="uuid2") - 批处理优化:SEQUENCE 策略配合
hibernate.jdbc.batch_size提升插入效率 - 数据库方言:Hibernate 根据方言自动转换策略(如 AUTO 在 MySQL 转为 IDENTITY)