У меня есть две таблицы базы данных, Timeline и Drive.
Временная шкала имеет следующие столбцы:
timeline:
id | eventName | driveId
Диск имеет следующие столбцы:
drive:
id | mileage | date
Каждый столбец миль и дат превращается в УНИКАЛЬНОЕ ограничение в таблице, так что, если пробег и дата одинаковы, это не позволит вставить его в таблицу.
Таблица шкалы времени имеет отношение один к одному с приводом. Я сопоставил эту взаимосвязь с аннотацией ManyToOne в моем классе объектов данных в kotlin.
Однако, когда я сохраняю объект временной шкалы в kotlin, содержащий приводной объект, он ВСЕГДА сохраняет постоянный приводной объект, даже если он является дубликатом.
Моя цель состоит в том, чтобы приводной объект сохранялся только в том случае, если он еще не существует, иначе просто обновите driveId до текущего сохраненного приводного объекта.
Для этого я нашел обходной путь, в котором я сначала запрашиваю таблицу накопителей, чтобы узнать, существует ли еще потенциальный объект timeline.drive.
Если приводной объект еще не существует в таблице, я сохраняю приводной объект, а затем сохраняю объект временной шкалы.
Если приводной объект существует, я устанавливаю timeline.drive = driveFromTable
, а затем сохраняю объект временной шкалы
Примечание. Я установил тип CASCADE, чтобы он не включался при сохранении при реализации этого способа.
Эта манипуляция требует большого количества кода, а также проблем с обслуживанием по мере роста и тестирования кода.
Есть ли способ указать hibernate сохранить дочерний объект (диск), только если он еще не существует в моей базе данных, когда я сохраняю родительский объект?