侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Hibernate实体类映射基础

2025-12-13 / 0 评论 / 4 阅读

题目

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可根据实体自动更新表结构