Генерация массового идентификатора Spring Data JPA

#postgresql #hibernate #kotlin #jpa

Вопрос:

У меня есть сущность, для которой, помимо первичного ключа, должен быть сгенерирован дополнительный уникальный идентификатор:

 @Entity
class MyEntity(
   val otherId: String // <- this id is unique as well
) {
    @Id
    @Generated
    var id: UUID // PK
}
 

otherId значение свойства выводится из значения последовательности postgres путем вызова SELECT nextval(...) и добавления строки префикса. Когда я выполняю массовые вставки, мне приходится прибегать к пользовательскому запросу, определенному в моем репозитории JPA для сущности, который извлекает несколько значений последовательности одновременно, но я хотел бы сделать этот процесс автоматическим.

Я попытался реализовать IdentifierGenerator интерфейс, но лучшее, чего я смог добиться SELECT nextval , — это то, что для каждой вставленной новой сущности был сделан один запрос, что в моем случае совершенно неприемлемо, поскольку пакеты могут состоять из сотен сущностей. Копание в деталях гибернации также не дало мне ответа, как это сделать.

Есть ли способ сгенерировать несколько идентификаторов с помощью некоторого обратного вызова/подключения для нескольких объектов одновременно? Или мне все равно придется все делать вручную?

Ответ №1:

Существуют способы реализации этого, см. Эту статью в качестве примера: https://thorben-janssen.com/custom-sequence-based-idgenerator/

Для повышения производительности вам придется настроить размер приращения, который по умолчанию равен 50. Это означает, что он увеличит последовательность на 50 и поместит эти значения в пул, из которого значения будут использоваться для генерации идентификаторов.