📜  @generatedvalue 策略 (1)

📅  最后修改于: 2023-12-03 15:29:14.274000             🧑  作者: Mango

@GeneratedValue 策略

在开发过程中,实现主键自动生成一直是一个很常见的需求,不同的数据库提供了不同的实现方式。然而,在实际应用中,我们往往需要处理并发情况下的数据一致性问题。因此,为了避免主键重复,我们往往会采用类似 UUID 或者 Snowflake 算法来生成主键。但是,这种方式虽然可以避免主键重复,但是由于需要对主键进行复杂计算,无论是在性能还是在可维护性上都有很大的影响。

而 Hibernate 提供了一种更为简洁和高效的方式:@GeneratedValue 策略。

什么是 @GeneratedValue 策略?

@GeneratedValue 是一种 Hibernate 注解,用于指定实体类的主键生成策略。 Hibernate 支持多种主键生成策略,包括数据库递增、表递增、序列等。通过使用 @GeneratedValue 可以让 Hibernate 自动为我们生成主键。

常用的 @GeneratedValue 策略

以下是几种常见的 @GeneratedValue 策略:

AUTO

AUTO@GeneratedValue 的默认值。它会根据数据库类型及策略自动选择生成策略,通常选择的是 IDENTITYSEQUENCE 策略。

IDENTITY

IDENTITY 策略是依靠数据库自动增长实现主键自增的功能。当我们新建一条记录时,系统会帮我们自动生成一个主键。

@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    //...
}
SEQUENCE

SEQUENCE 策略通过创建一个序列对象,控制生成的主键的唯一性,可以跨表保证主键的唯一性。不同数据库的实现方式略有不同,但是大致思路一致。

@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq")
    @SequenceGenerator(name = "user_id_seq", sequenceName = "user_id_seq", allocationSize = 1)
    private Long id;

    //...
}

使用 SEQUENCE 策略,需要指定 sequenceName 属性用于关联数据库中的序列名称。

TABLE

TABLE 策略通过为每张表单独设计一个记录主键值的表来实现主键自增的功能。

@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_id_gen")
    @TableGenerator(name = "user_id_gen", table = "id_generator", pkColumnName = "id_name", pkColumnValue = "user_id", valueColumnName = "id_value", initialValue = 100, allocationSize = 1)
    private Long id;

    //...
}
总结

以上就是 @GeneratedValue 策略的简单介绍和常见用法。使用 @GeneratedValue 可以非常方便地为我们解决主键生成的问题,提高代码的可维护性和可读性。同时,Hibernate 提供了很多不同的主键生成策略供我们选择,我们可以根据项目的具体需求选择不同的策略。