JPA 主键ID生成策略

在定义Entity的ID字段时,我们可以使用@GeneratedValue注解指定以何种方式生成数据库的主键ID的值。有几种策略:

1. 默认情况下,是自动生成策略。

比如下边两种方式效果是一样的。如果使用的是Springboot JPA Data, 那hibernate会自动帮我们创建一个Sequence,然后通过该Sequence,为所有生成策略是Auto的表使用该Sequence,也就是多个表共享一个Sequence。

@Entity
public class Student {

    @Id
    @GeneratedValue
    private long studentId;

    // ...
}

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long studentId;

    // ...
}

2. IDENTITY生成策略。

就是ORM框架不负责生成ID,而是由数据库创建表时,将主键列,制定成自增(auto increment)。应用程序向数据库插入数据时,无需指定该列的值。

@Entity
public class Student {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private long studentId;

    // ...
}

3. 我们自定义的数据库的Sequence方式。 

这也是Hibernate官方推荐的方式,为每一个表创建一个Sequence。Hibernate在生成@ID标注的字段的值时,先访问数据库,查询下一个Sequence的值,再封装完整的insert语句插入数据。

@Entity
public class User {
    @Id
    @GeneratedValue(generator = "sequence-generator")
    @GenericGenerator(
      name = "sequence-generator",
      strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
      parameters = {
        @Parameter(name = "sequence_name", value = "user_sequence"),
        @Parameter(name = "initial_value", value = "4"),
        @Parameter(name = "increment_size", value = "1")
        }
    )
    private long userId;
    
    // ...
}

另外,还有表的方式生成ID主键值,不推荐,这里不详细说了。

参考文档: 

​​​​​​​​​​​​​​https://www.baeldung.com/hibernate-identifiers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值