题目
Hibernate实体类映射基础
信息
- 类型:问答
- 难度:⭐
考点
实体类注解,主键生成策略,基本映射配置
快速回答
在Hibernate中映射实体类需要:
- 使用
@Entity注解标记类 - 使用
@Id标注主键字段 - 通过
@GeneratedValue配置主键生成策略 - 使用
@Column自定义字段映射(可选)
推荐策略:MySQL用GenerationType.IDENTITY,Oracle用GenerationType.SEQUENCE。
解析
原理说明
Hibernate通过JPA注解将Java对象映射到数据库表,核心是通过元数据描述对象-关系映射(ORM)。实体类需满足:
- 有无参构造函数
- 非final类(Lazy Loading代理需要)
- 主键字段必须
代码示例
@Entity
@Table(name = "employees") // 可选,默认类名作表名
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // MySQL自增主键
private Long id;
@Column(name = "full_name", length = 100, nullable = false)
private String name;
// 无参构造器(必须)
public Employee() {}
// Getter/Setter方法(必须)
// ...
}主键生成策略详解
| 策略 | 说明 | 适用数据库 |
|---|---|---|
GenerationType.IDENTITY | 数据库自增字段(如MySQL AUTO_INCREMENT) | MySQL, SQL Server |
GenerationType.SEQUENCE | 使用数据库序列(需创建Sequence) | Oracle, PostgreSQL |
GenerationType.TABLE | 通过专用表模拟序列(效率低) | 跨数据库通用 |
GenerationType.AUTO | 自动选择(默认策略) | 依赖数据库方言 |
最佳实践
- 主键类型:使用包装类型Long而非long(允许null)
- 字段默认:未标注
@Column时,默认使用字段名作列名 - 策略选择:生产环境避免
AUTO,明确指定策略 - 命名规范:表名/列名使用蛇形命名(snake_case)
常见错误
- ❌ 忘记无参构造器导致Hibernate实例化失败
- ❌ 在非支持自增的数据库上用
IDENTITY(如Oracle) - ❌ 混淆
@GeneratedValue和@GenericGenerator(后者是Hibernate特有) - ❌ 实体类未添加
@Entity注解
扩展知识
- 组合主键:需定义
@EmbeddedId或@IdClass - 字段类型映射:
@Temporal处理日期,@Lob处理大文本 - DDL生成:
hibernate.hbm2ddl.auto=update可根据实体自动更新表结构