Spring 使用当前年份和分配的ID初始化字段

Spring 使用当前年份和分配的ID初始化字段,spring,hibernate,jpa,Spring,Hibernate,Jpa,我有一个我一直坚持的实体。当通过Spring存储库将其存储到数据库中时,会自动分配其ID。 在同一个实体中,我有一个从Id和当前年份生成的字段:“-” 在一个用@PrePersist注释的方法中,尚未分配ID,因此我在@pospersist方法中编写了一些代码: @PostPersist protected void setupOrderNumber() { this.orderNumber = Calendar.getInstance().get(Calendar.YEAR) + "-

我有一个我一直坚持的实体。当通过Spring存储库将其存储到数据库中时,会自动分配其ID。 在同一个实体中,我有一个从Id和当前年份生成的字段:
“-”

在一个用
@PrePersist
注释的方法中,尚未分配ID,因此我在
@pospersist
方法中编写了一些代码:

@PostPersist
protected void setupOrderNumber() {
    this.orderNumber = Calendar.getInstance().get(Calendar.YEAR) + "-" + id;
}
此代码不会将
orderNumber
存储到数据库中,因为实体已存储。 我如何通过JPA直接在实体内实现这样的结果


如果JPA不可能,我可以使用Hibernate和
@Formula
注释,但我不确定如何编写:
@Formula(“提取(从当前日期算起的年份)+'-'+id”)
似乎不起作用。

正如您已经注意到的那样:在
@PrePersist
中,生成的ID不可用-只是因为在保存到数据库中之后设置了ID。并且不会持久化在
@PostPersist
中所做的任何更改,因为持久化已经发生了

只要不需要数据库中的值,就可以使用
@公式。但是我不会使用
extract(从当前日期算起的年份)
——因为这会在年份发生变化时改变
orderNumber
——这与您使用
@PostPersist
的实验有什么不同

而是使用一个年份字段,您可以在
@PrePersist
中初始化该字段,并在公式中引用该字段:

@Entity
public class MyEntity {

  @Id
  @GeneratedValue(...)
  private Long id;

  private int year;

  @Formula("concat(id, '-', year)")
  private String orderNumber;

  @PrePersist
  private void prePersist() {
     this.year = Calendar.getInstance().get(Calendar.YEAR);
  }

  @PostPersist
  private void postPersist() {
     this.orderNumber = id + "-" + year;
  }

}
我还初始化了
postPersist()
中的
orderNumber
,以便在
EntityManager.persist()之后立即有一个有效值