一、核心注解的作用(先搞懂"为什么这么写")
你贴的代码是JPA(Java Persistence API,Java持久化规范)的基础用法,目的是让「Java类」和「数据库表」建立映射关系,不用手动写SQL创建表、插数据。
| 注解 | 作用(大白话) | 是否"固定" |
|---|---|---|
@Entity |
标记这个类是「实体类」,对应数据库里的一张表 | 必须有(想映射表就必须加) |
@Id |
标记这个字段是表的「主键」(唯一标识一行数据) | 必须有(每张表都得有主键) |
基础映射规则(默认行为)
JPA会按"约定优于配置"的规则自动映射,不用额外配置时:
- 类名 → 表名 :
Student类默认对应数据库里的student表(类名首字母小写); - 字段名 → 列名 :
id字段对应id列,name对应name列,age对应age列; - 字段类型 → 列类型 :
Long→ 数据库的BIGINT,String→VARCHAR,Integer→INT。
二、"固定格式"的边界(哪些必须有,哪些能灵活改)
1. 必须遵守的"硬性规则"(改了就映射失败)
- ✅
@Entity必须加在类上(不能加在方法/字段上),且类必须是「普通Java类」(不能是抽象类、接口); - ✅
@Id必须加在主键字段上(每张表必须有主键,JPA强制要求); - ✅ 实体类必须有无参构造器(你贴的代码里没写,但JPA会自动生成默认的无参构造器,显式写出来更规范)。
2. 可以灵活调整的"非固定格式"(按需定制)
实际开发中,默认映射往往满足不了需求,比如表名不想用类名小写、列名想自定义、主键想自增等,这时可以加额外注解调整:
示例:定制化映射(更贴近实际开发)
java
import jakarta.persistence.*; // Spring Boot 3.x用jakarta,2.x用javax
@Entity
@Table(name = "t_student") // 自定义表名(默认是student,改成t_student)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增(数据库自动生成id)
private Long id;
@Column(name = "stu_name", length = 50, nullable = false) // 自定义列名+长度+非空
private String name;
@Column(name = "stu_age") // 自定义列名
private Integer age;
// 显式写无参构造器(推荐,避免JPA反射失败)
public Student() {}
// 可选:有参构造器、getter/setter
public Student(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter/setter(必须有,JPA要通过反射读写字段)
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
这里头this 的作用是区分重名:区分类的成员变量和方法的参数变量
关键定制化注解说明:
@Table(name = "t_student"):指定类对应的数据表名(解决"类名和表名不一致"的问题);@GeneratedValue(strategy = GenerationType.IDENTITY):设置主键自增(插入数据时不用手动传id,数据库自动生成);@Column(name = "stu_name", length = 50, nullable = false):name:自定义列名(比如name字段对应stu_name列);length:设置字符串列的长度(默认255,改成50更合理);nullable = false:设置列非空(数据库层面限制,避免插入空值)。
三、常见误区(新手必避)
- 以为
@Entity是"固定格式"就不能改 :@Entity只是标记类为实体,配合@Table能自定义表名、表的索引等; @Id只加在Long类型上 :主键可以是Integer/String等(比如用字符串做主键),但Long是最常用的(支持大数自增);- 忘了加getter/setter:JPA通过反射读写字段,没有getter/setter会导致"能插入数据但查不出来";
- Spring Boot 2.x和3.x的包名差异 :2.x用
javax.persistence.*,3.x用jakarta.persistence.*,导包错了会报错。
总结
- 核心固定规则 :
@Entity必须加在类上(想映射表就必须有);@Id必须加在主键字段上(每张表必须有主键);- 实体类必须有无参构造器(显式/隐式均可)。
- 灵活调整点 :
- 用
@Table自定义表名; - 用
@Column自定义列名、长度、非空等; - 用
@GeneratedValue设置主键自增策略。
- 用
- 核心逻辑:JPA的映射是"约定优于配置",默认规则能满足基础需求,特殊场景加注解定制即可。
@Entity和@Id的核心地位不会变------这两个是映射数据库表的"基础门槛"。