Spring генерирует прогрессивный уникальный int для объекта - PullRequest
0 голосов
/ 07 марта 2019

Я работаю над 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);
    }

Другими словами, я сохраняю объект и обновляю его, используя идентификатор созданной БД, но мне интересно, есть ли лучший способ сделать это.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 07 марта 2019

Чтобы код был немного чище, вы можете использовать @PostPersist, поэтому добавьте метод, как показано ниже, к вашему Document:

@PostPersist
private void postPersist() {
    int year = Calendar.getInstance().get(Calendar.YEAR);
    this.protocolNumber = this.getId() + "/" + year ;       
}

Вам не нужно снова сохранять / сохранять экземпляр после этого обновления. Так что если вам действительно нужно хранить protocolNumber в базе данных.

Но: это protocolNumber также является переходным значением, поэтому вы можете рассмотреть возможность добавления только поля year в Document, удаления поля protocolNumber и создания метода получения, подобного:

public String getProtocolNumber() {
    return this.id + "/" + this.year;
}

Таким образом, вам не нужно знать id при сохранении.

...