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

var*_*en_ 3 java postgresql spring hibernate jpa

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

uuid character varying(36) not null default uuid_generate_v1mc()
Run Code Online (Sandbox Code Playgroud)

创建时,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;
(...)
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

跟进:谢谢大家的评论和回答。看起来我有两个选择,要么从 DB 重新加载实体以让 DB 生成 uuid,要么在代码中自己生成。哪一个是首选?我猜后者的性能更高,但还有什么需要考虑的吗?

nco*_*boy 5

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

@PrePersist
public void autofill() {
    this.setUuid(UUID.randomUUID().toString());
}
Run Code Online (Sandbox Code Playgroud)

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

你可以用命令运行它

gradle bootRun
Run Code Online (Sandbox Code Playgroud)

你会得到一些这样的消息

2017-06-26 11:12:16.118 INFO 78681 --- [main] hello.Application :用 findOne(1L) 找到的客户:2017-06-26 11:12:16.119 INFO 78681 --- [main] hello。申请:-------------------------------- 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.1262 INFO 78 --- [ main] hello.Application : 2017-06-26 11:12:16.122 INFO 78681 --- [main] hello.Application
: 客户找到 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 字段工作正常!!!