#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 и поместит эти значения в пул, из которого значения будут использоваться для генерации идентификаторов.