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

时间:2015-10-25 17:16:08

标签: spring hibernate jpa

我有一个我坚持的实体。通过Spring Repository将其存储到数据库中时,会自动分配其ID。 在同一个实体中,我有来自Id和当前年份的字段构建:"<current_year>-<id>"

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

@PostPersist
protected void setupOrderNumber() {
    this.orderNumber = Calendar.getInstance().get(Calendar.YEAR) + "-" + id;
}

此代码不会将orderNumber存储到数据库中,因为实体已存储。 如何直接在实体内使用JPA实现这样的结果?

如果JPA不可能,我可以使用带有@Formula注释的Hibernate,但我不确定如何编写它:@Formula("extract(year from current_date) + '-' + id")似乎不起作用。

1 个答案:

答案 0 :(得分:0)

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

只要您不需要数据库中的值,就可以使用@Formula。但我不会使用extract(year from current_date) - 因为这会在年份发生变化时更改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;
  }

}

我也会在orderNumber中初始化postPersist(),以便在EntityManager.persist()之后立即获得有效值。