java—在spring启动实体中自动生成的唯一键

qnzebej0  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(437)

我有一个在我的实体表,这是自动生成的主键,但现在我想自动生成唯一的键,所以如何做请帮助我。

@Entity
    @Table(name = "director")
    public class Director {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private long id;

//how to make this field auto generated like above one
        @Column(name = "subid", unique=true)
        private long sub_id;

我的数据库表图片在这里请参考

3j86kqsm

3j86kqsm1#

您可以使用时间戳或 static AtomicLong 计数器组件 sub_id 价值观。尝试用注解定义方法 @PrePersist 在实体类中,jpa提供者将在持久化对象之前执行它。
注意:在并发环境中使用时间戳可能会导致冲突,并且值不会是唯一的。

private final static AtomicLong subIdCounter = new AtomicLong(System.nanoTime());

@PrePersist
void sub_id() {
    this.sub_id = subIdCounter.incrementAndGet();
}
bgibtngc

bgibtngc2#

经过一个简短的研究,hibernate似乎只支持带有注解的字段生成值的特性 @Id . 与 @Id 违约 @generatedValue hibernate根据所使用的数据库和方言创建适当的方法来生成id字段的值。通常,这类似于创建一个序列并设置列定义(示例来自postgres 12):
id bigint not null nextval('director\ id\ seq'::regclass)
有趣的是,这是通过发出如下create语句来实现的:
创建表控制器(id bigserial not null,主键(id))
因此,列类型bigserial实际上生成了用于将默认值插入id列的序列。
有两个选项可供您在生成列id时为列sub\ id生成值。这两个选项都依赖于数据库。
只需手动将序列创建到数据库,并更改列sub\u id以从序列中获取默认值。

更改列定义以使用适当的列类型,如:

@Column(name = "subid", insertable = false,
        nullable = false, unique = true, columnDefinition = "bigserial")
private long sub_id;

这将导致hibernate生成如下表:
创建表控制器(id bigserial not null,subid bigserial not null,主键(id))
并生成如下列:
subid bigint not null nextval('director\u subid\u seq'::regclass)
但再次强调:这是特定于数据库的东西。
还要注意:jpa只知道存储到id字段的值。subid被插入到数据库表中,但在实体在其持久性上下文中刷新之前,sub\u id字段不会被填充。

相关问题