我有一个我坚持的实体。通过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")
似乎不起作用。
答案 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()
之后立即获得有效值。