【问题标题】:Unique key auto generated in Spring Boot EntitySpring Boot Entity 中自动生成的唯一键
【发布时间】:2020-12-24 08:26:29
【问题描述】:

我的实体表中有一个主键,它是自动生成的,但现在我希望自动生成唯一键,所以怎么做 请帮帮我。

    @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;

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

【问题讨论】:

    标签: java mysql spring-boot spring-data-jpa entity


    【解决方案1】:

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

    private final static AtomicLong subIdCounter = new AtomicLong(System.nanoTime());
    
    @PrePersist
    void sub_id() {
        this.sub_id = subIdCounter.incrementAndGet();
    }
    

    【讨论】:

    • 表示不能将 sub_id 设置为空值
    • 您是将新对象保存到数据库还是更新已存在? @PrePersist 方法仅在 INSERT 操作之前调用。对于 UPDATE 操作,还有另一个注释。插入新对象时是否调用此方法?签入调试
    • 为什么sub_id值为负
    • 您在 DB 中为 sub_id 使用什么数据类型? Long 是 64 位有符号整数,所以在 MySQL 中你必须使用 BigInt 类型
    • 当我在 mysql 中做 long 实体和 bigint 时,它工作得很好。谢谢
    【解决方案2】:

    经过简短的研究,Hibernate 似乎只支持带有 @Id 注释的字段的生成值的功能。使用@Id 和默认@generatedValue,Hibernate 会根据所使用的数据库和方言创建适当的方式来生成 id 字段的值。通常这类似于创建 sequence 并设置列定义(示例来自 Postgres 12):

    id bigint not null nextval('director_id_seq'::regclass)

    有趣的是,这是通过发出这样的 create 语句来完成的:

    创建表导向器(id bigserial 不为空,主键(id))

    所以,列类型bigserial实际上会生成用于将默认值插入到id列的序列。

    您希望为列 sub_id 生成值,因为它是为列 id 生成的。两者都依赖于数据库。

    只需手动将序列创建到数据库并更改列 sub_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_subid_seq'::regclass)

    但又一次:这是数据库特定的东西。

    另请注意:JPA 只知道存储在 id 字段中的值。 subid 被插入到数据库表中,但 sub_id 字段不会被填充,直到实体在其持久性上下文中被刷新。

    【讨论】:

    • 我正在使用 MySQL 不知道 Postgre 但在 SQL 中我找不到任何解决方案,但在你的答案之前的解决方案给出了独特的结果,但它们都是负面的我需要解决这个问题或者如果你可以为我提供任何关于 SQL 的东西,这样也更好
    猜你喜欢
    • 2014-02-02
    • 2020-10-12
    • 2019-09-14
    • 2017-07-30
    • 1970-01-01
    • 2017-03-27
    • 2021-12-03
    • 2019-02-18
    • 2016-10-01
    相关资源
    最近更新 更多