Spring Boot中Spring Data JPA的常用注解
在Spring Boot中,Spring Data JPA通过一系列注解简化了数据库操作,这些注解主要用于实体类与数据库表的映射、字段约束、关系定义等。以下是常用注解的详细介绍:
一、实体类与表映射注解
-
@Entity
- 作用:标记类为JPA实体类,对应数据库中的一张表。
- 说明:类名默认映射为表名,若需自定义表名,可配合
@Table
使用。 - 示例:
@Entity @Table(name = "t_user") // 映射到数据库表t_user public class User { ... }
-
@Table
- 作用:指定实体类对应的数据库表名,还可配置表的索引、唯一约束等。
- 常用属性:
name
:表名(默认与类名一致)。uniqueConstraints
:定义表的唯一约束。
- 示例:
@Table(name = "t_user",uniqueConstraints = {@UniqueConstraint(columnNames = {"username"})} // username字段唯一 )
二、主键相关注解
-
@Id
- 作用:标记实体类的主键字段,必须与主键生成策略注解配合使用。
-
@GeneratedValue
- 作用:指定主键生成策略,常用属性
strategy
取值:GenerationType.IDENTITY
:依赖数据库自增(如MySQL的AUTO_INCREMENT),最常用。GenerationType.SEQUENCE
:依赖数据库序列(如Oracle的SEQUENCE)。GenerationType.TABLE
:通过中间表维护主键生成,兼容性强但性能较差。GenerationType.AUTO
:由JPA自动选择策略(默认值)。
- 示例:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键 private Long id;
- 作用:指定主键生成策略,常用属性
三、字段映射与约束注解
-
@Column
- 作用:映射实体类字段与数据库表字段,可配置字段名、长度、是否可为空等。
- 常用属性:
name
:数据库字段名(默认与属性名一致)。length
:字段长度(字符串类型有效)。nullable
:是否允许为null(默认true)。unique
:是否唯一(默认false)。columnDefinition
:自定义字段类型(如VARCHAR(200) COMMENT '用户昵称'
)。
- 示例:
@Column(name = "user_name", // 数据库字段名为user_namelength = 50,nullable = false ) private String username;
-
@Transient
- 作用:标记字段不映射到数据库表(即该字段在表中不存在),通常用于临时计算属性。
- 示例:
@Transient private String tempData; // 不会在数据库中生成字段
-
@Temporal
- 作用:指定日期时间类型字段在数据库中的存储格式(仅用于
java.util.Date
或java.util.Calendar
类型)。 - 常用值:
TemporalType.DATE
:仅存储日期(如2023-10-01
)。TemporalType.TIME
:仅存储时间(如14:30:00
)。TemporalType.TIMESTAMP
:存储日期+时间(如2023-10-01 14:30:00
)。
- 示例:
@Temporal(TemporalType.TIMESTAMP) private Date createTime;
- 作用:指定日期时间类型字段在数据库中的存储格式(仅用于
四、关系映射注解(多表关联)
-
@OneToOne
- 作用:定义一对一关系(如用户与用户详情)。
- 常用属性:
mappedBy
:指定关联关系的维护方(对方实体类中的属性名)。cascade
:级联操作(如CascadeType.ALL
表示所有操作级联)。
- 示例:
// User类(被维护方) @OneToOne(mappedBy = "user") // 关联UserDetail中的user属性 private UserDetail detail;// UserDetail类(维护方) @OneToOne @JoinColumn(name = "user_id") // 外键字段user_id关联user表的id private User user;
-
@OneToMany
与@ManyToOne
- 作用:定义一对多(如部门与员工)和多对一关系。
- 示例(部门-员工):
// 部门类(一方) @OneToMany(mappedBy = "dept", cascade = CascadeType.ALL) private List<Employee> employees;// 员工类(多方) @ManyToOne @JoinColumn(name = "dept_id") // 外键dept_id关联部门表的id private Department dept;
-
@ManyToMany
- 作用:定义多对多关系(如用户与角色),通常需要中间表维护关联。
- 示例:
// 用户类 @ManyToMany @JoinTable(name = "user_role", // 中间表名joinColumns = {@JoinColumn(name = "user_id")}, // 中间表中关联当前表的外键inverseJoinColumns = {@JoinColumn(name = "role_id")} // 中间表中关联对方表的外键 ) private List<Role> roles;// 角色类 @ManyToMany(mappedBy = "roles") // 关联用户类中的roles属性 private List<User> users;
五、查询与验证注解
-
@NamedQuery
- 作用:在实体类上定义命名查询,可被Repository接口直接调用。
- 示例:
@Entity @NamedQuery(name = "User.findByUsername",query = "SELECT u FROM User u WHERE u.username = :username" ) public class User { ... }// 在Repository中使用 public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username); // 直接映射命名查询 }
-
@Enumerated
- 作用:指定枚举类型字段在数据库中的存储方式。
- 常用值:
EnumType.ORDINAL
:存储枚举的索引(默认,如0、1、2)。EnumType.STRING
:存储枚举的名称(如"MALE"、“FEMALE”)。
- 示例:
public enum Gender { MALE, FEMALE }@Enumerated(EnumType.STRING) private Gender gender; // 数据库存储"MALE"或"FEMALE"
六、总结
Spring Data JPA的注解极大简化了实体类与数据库的映射关系,核心功能包括:
- 表与实体映射(
@Entity
、@Table
)。 - 主键定义(
@Id
、@GeneratedValue
)。 - 字段约束(
@Column
、@Transient
)。 - 关系映射(
@OneToOne
、@OneToMany
、@ManyToMany
)。
合理使用这些注解可以减少SQL编写,专注于业务逻辑,同时保持代码的可读性和可维护性。