我有一个名为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,要么自己在代码中生成它。哪一个更受欢迎?我猜后者性能更高,但还有什么需要考虑的吗?
答案 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();