我正在春季使用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

10-08 12:06