有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring数据JPA生成的uuid字段为空

我有一个名为Booking的实体,它有一个生成的id字段,我用它作为主键。它很好用。我想添加另一个字段uuid,在REST API中用作资源标识符。 我有一个Postgres DB,并将字段设置为自动生成:

uuid character varying(36) not null default uuid_generate_v1mc()

在创建时,DB会生成id和uuid,但在Java代码中,uuid字段为空。我的实体如下所示:

@Entity
public class Booking {

    @Id
    @SequenceGenerator(name="booking_id_seq", sequenceName="booking_id_seq", allocationSize=1)
    @GeneratedValue(strategy= GenerationType.IDENTITY, generator = "booking_id_seq")
    private Long id;

    @Column(nullable = false)
    private String uuid;
(...)
}

我做错了什么

后续行动: 谢谢大家的评论和回答。看起来我有两个选择,要么从数据库重新加载实体,让数据库生成uuid,要么在代码中自己生成uuid。你更喜欢哪一个?我想后者更具表现力,但还有什么要考虑的吗?


共 (2) 个答案

  1. # 1 楼答案

    您可以在实体类中使用@PrePersist进行填充

    @PrePersist
    public void autofill() {
        this.setUuid(UUID.randomUUID().toString());
    }
    

    我为你的问题创建了一个示例项目 https://github.com/zz-chen/Sample-spring-data-jpa-generate-uuid

    你可以用命令运行它

    gradle bootRun
    

    你会得到这样的信息

    2017-06-26 11:12:16.118 INFO 78681 - [ main] hello.Application : Customer found with findOne(1L): 2017-06-26 11:12:16.119 INFO 78681 - [ main] hello.Application : 2017-06-26 11:12:16.120 INFO 78681 - [ main] hello.Application : Customer[id=1, firstName='Jack', lastName='Bauer',uuid='44969325-c31f-4b8e-96d6-a59ff9b845b6'] 2017-06-26 11:12:16.122 INFO 78681 - [ main] hello.Application : 2017-06-26 11:12:16.122 INFO 78681 - [ main] hello.Application
    : Customer found with findByLastName('Bauer'): 2017-06-26 11:12:16.122 INFO 78681 - [ main] hello.Application
    : 2017-06-26 11:12:16.158 INFO 78681 - [ main] hello.Application
    : Customer[id=1, firstName='Jack', lastName='Bauer',uuid='44969325-c31f-4b8e-96d6-a59ff9b845b6'] 2017-06-26 11:12:16.158 INFO 78681 - [ main] hello.Application : Customer[id=3, firstName='Kim', lastName='Bauer',uuid='0cef24ad-ce97-4c79-b8a4-69ff575326fb']

    有了这个消息,我们可以确认uuid字段工作正常

  2. # 2 楼答案

    您只需在实体的字段中添加以下内容:

    import java.util.UUID;
    
    @Column(unique = true, name = "uuid", nullable = false)
    private String uuid = UUID.randomUUID().toString().toUpperCase();