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

时间:2017-06-25 19:18:03

标签: java spring postgresql hibernate jpa

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

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

在创建时,DB生成id和uuid就好了,但在Java代码中,uuid字段为null。我的实体看起来像这样:

@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;
(...)
}

我做错了什么?

跟进: 感谢大家的意见和答案。看起来我有两个选择,要么从DB重新加载实体以获得由DB生成的uuid,要么自己在代码中生成它。哪一个更受欢迎?我猜后者性能更高,但还有什么需要考虑的吗?

2 个答案:

答案 0 :(得分:3)

您可以在实体类中填写@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 --- [主要]   hello.Application:找到客户   findOne(1L):2017-06-26 11:12:16.119 INFO 78681 --- [主要]   你好。应用程序:   -------------------------------- 2017-06-26 11:12:16.120 INFO 78681 --- [主要] hello.Application:Customer [id = 1,firstName =' Jack',   的lastName ='鲍尔',UUID =' 44969325-c31f-4b8e-96d6-a59ff9b845b6']   2017-06-26 11:12:16.122 INFO 78681 --- [主要]   hello.Application:2017-06-26 11:12:16.122   INFO 78681 --- [主要]你好。申请
  :找到findByLastName的客户(' Bauer'):2017-06-26 11:12:16.122   INFO 78681 --- [主要]你好。申请
  :-------------------------------------------- 2017-06-26 11:12:16.158   INFO 78681 --- [主要]你好。申请
  :客户[id = 1,firstName =' Jack',   的lastName ='鲍尔',UUID =' 44969325-c31f-4b8e-96d6-a59ff9b845b6']   2017-06-26 11:12:16.158 INFO 78681 --- [主要]   hello.Application:Customer [id = 3,   的firstName ='金&#39 ;,   的lastName ='鲍尔',UUID =' 0cef24ad-ce97-4c79-b8a4-69ff575326fb']

我们可以通过消息确认uuid字段是否完美!!!

答案 1 :(得分:1)

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

import java.util.UUID;

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