JPA注解@GeneratedValue及其strategy枚举

本文介绍了JPA注解@GeneratedValue的使用,特别是其strategy枚举的详细解释。针对如何在SpringBoot中配合MySQL自动生成主键策略进行了说明,避免在保存数据时遇到找不到生成器的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JPA注解@GeneratedValue及其strategy枚举


1.源码

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GeneratedValue {
   
   
    GenerationType strategy() default GenerationType.AUTO;

    String generator() default "";
}
public 
在 Spring Data JPA 中,注解是开发者定义实体类与数据库表之间映射关系的核心方式。通过这些注解,可以简化数据库操作并提高代码的可读性。以下是关于 Spring Data JPA 注解的使用方法和说明。 ### 1. 基础注解 #### `@Entity` `@Entity` 注解用于标记一个 Java 类为实体类,表示该类将映射到数据库中的某个表。通常情况下,它会配合 `@Table` 使用以指定对应的表名[^3]。 ```java @Entity @Table(name = "users") public class User { // 实体字段 } ``` #### `@Id` `@Id` 用于标识实体类的主键字段。它是必须的,并且需要配合 `@GeneratedValue` 来指定主键生成策略(如果主键是自动生成的)[^4]。 ```java @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ``` #### `@GeneratedValue` `@GeneratedValue` 用于指定主键值的生成策略。常见的策略包括: - `GenerationType.IDENTITY`:依赖数据库的自增机制(例如 MySQL 的 AUTO_INCREMENT)。 - `GenerationType.AUTO`:由持久化提供者自动选择最适合的策略。 - `GenerationType.TABLE`:通过一张独立的表来维护主键值。 - `GenerationType.SEQUENCE`:使用数据库序列生成主键(适用于支持序列的数据库如 PostgreSQL)。 #### `@Column` `@Column` 注解用于描述实体类属性与数据库列之间的映射关系。它可以配置列名、长度、是否允许为空等属性。 ```java @Column(name = "username", nullable = false, length = 50) private String username; ``` #### `@Table` `@Table` 用于指定实体类所对应的数据库表名称。如果不指定,默认使用类名作为表名(但通常推荐显式指定)[^3]。 ```java @Entity @Table(name = "employees") public class Employee { // 实体字段 } ``` ### 2. 关系型注解 #### `@OneToOne` `@OneToOne` 用于定义两个实体之间的一对一关系。这种关系通常需要指定外键。 ```java @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "address_id", referencedColumnName = "id") private Address address; ``` #### `@OneToMany` `@OneToMany` 用于定义一对多的关系,例如一个用户可以有多个订单。 ```java @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Order> orders; ``` #### `@ManyToOne` `@ManyToOne` 用于定义多对一的关系,例如多个订单对应一个用户。 ```java @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user; ``` #### `@ManyToMany` `@ManyToMany` 用于定义多对多的关系,通常需要中间表来管理关联。 ```java @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private Set<Role> roles; ``` ### 3. 其他常用注解 #### `@Transient` `@Transient` 用于标记某个字段不需要被持久化到数据库中。 ```java @Transient private String temporaryField; ``` #### `@Temporal` `@Temporal` 用于处理日期和时间类型的字段,可以指定 `TemporalType.DATE`、`TemporalType.TIME` 或 `TemporalType.TIMESTAMP`。 ```java @Temporal(TemporalType.DATE) @Column(name = "birth_date") private Date birthDate; ``` #### `@Enumerated` `@Enumerated` 用于将枚举类型映射到数据库中。可以选择存储为枚举的名称 (`EnumType.STRING`) 或序号 (`EnumType.ORDINAL`)。 ```java @Enumerated(EnumType.STRING) @Column(name = "status") private Status status; ``` #### `@CreationTimestamp` 和 `@UpdateTimestamp` 这两个注解分别用于自动记录实体创建时间和更新时间。 ```java @CreationTimestamp @Column(name = "created_at", updatable = false) private LocalDateTime createdAt; @UpdateTimestamp @Column(name = "updated_at") private LocalDateTime updatedAt; ``` ### 示例代码 以下是一个完整的实体类示例,展示了上述注解的综合使用: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "username", nullable = false, length = 50) private String username; @Column(name = "email", nullable = false, unique = true) private String email; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "address_id", referencedColumnName = "id") private Address address; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<Order> orders; @CreationTimestamp @Column(name = "created_at", updatable = false) private LocalDateTime createdAt; @UpdateTimestamp @Column(name = "updated_at") private LocalDateTime updatedAt; // Getters and setters } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简简单单OnlineZuozuo

感谢哥哥姐姐的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值