我正在春季使用REST api,并且需要保存
协议编号包含以下内容的实体Document
:
progressiveInt/currentyear
这是模型:
@Entity
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String protocolNumber;
}
我想出了这个解决方案:
public void saveDocument(Document document) {
Document savedDoc = documentRepository.save(document);
int year = Calendar.getInstance().get(Calendar.YEAR);
String protocolNumber = savedDoc.getId() + "/" + year;
savedDoc.setProtocolNumber(protocolNumber);
documentRepository.save(savedDoc);
}
换句话说,我正在保存对象并使用数据库创建的ID更新它,但是我想知道是否有更好的方法可以做到这一点。
有人可以帮忙吗?
最佳答案
要使代码更简洁一点,您可以使用@PostPersist
,因此在Document
中添加以下方法:
@PostPersist
private void postPersist() {
int year = Calendar.getInstance().get(Calendar.YEAR);
this.protocolNumber = this.getId() + "/" + year ;
}
此更新后,您无需再次保存/持久保存实例。因此,如果您确实需要将
protocolNumber
存储在数据库中,则可以这样做。但是:此
protocolNumber
还是一个瞬态值,因此您可能要考虑也仅将字段year
添加到您的Document
中,删除字段protocolNumber
并创建一个类似的getter:public String getProtocolNumber() {
return this.id + "/" + this.year;
}
这样,您在持久化时就不需要知道
id
。