Spring Boot-在保存对象时根据id字段保存非id字段

时间:2018-11-13 14:16:21

标签: java hibernate jpa

我在Spring Boot类中有一个自动增量ID字段:

private long id //or it can be int, does not matter

在同一个类中,我还有另一个字段,该字段必须是唯一的且字母数字:

private String code;

此字段将包含6个字母数字(大写或小写无关紧要)。

使用这种方法是否可以在为该类创建新对象时自动保存此字段?

Long.toString("id_field_value",36);

实际上,它给出:

0 -> 0
1 -> 1
10 -> A

因此,当创建第一个对象时,id将为1。

有什么建议吗?

例如,当我保存Person对象时,

id在JPA-hibarnate中将自动为1。

我也希望自动保存另一个字段,这取决于id字段。

因此,id为1,则string code也必须为1。

创建对象后应该这样做吗?喜欢:

人员person = personRepository.save(person3); person.setCode(person.getId()。toString); //或其他功能

2 个答案:

答案 0 :(得分:1)

您想要的code列似乎恰好是id列,但是具有另一种编码(以36为底,而不是以10为底)。

您不需要存储它,也不需要为此使用持久性注释:

  • 要读取代码:在实体上,只需添加基于getCode()值进行计算的getter方法id
  • 要按代码搜索,只需将代码从36转换为10,然后按id搜索即可。

答案 1 :(得分:1)

您可以尝试使用@PostPersist注释。持久化后,您的实体中就会有一个ID。像这样:

@PostPersist
private void postPersist() {
    this.setCode( generateMyCode( getId() ) );
}

只要使用EntityManager,此方法就可以正常工作,该域代码也应保留在数据库中。

在使用Spring存储库时,可能需要在初始保存后执行额外的save()(我不必这样做,只需使用默认配置),但是您应该在配置中测试这种方法。

(与使用EntityManager的JPA标准用法相比,Spring存储库处理持久性上下文的方式有些不同。)