Отключить разыменование внешнего ключа Hibernate - PullRequest
0 голосов
/ 06 февраля 2019

Hibernate отменяет ссылки на внешние ключи при удалении в некоторых случаях

При определении отношения OneToMany в Hibernate (с использованием аннотаций).На стороне отображения (многие стороны) я использую столбцы идентификаторов, а не объекты для определения такого отображения.Это в основном потому, что на стороне «Один» есть список таких сущностей.Определение свойств как таковых помогает избежать циклических зависимостей.

В приведенном ниже примере сущность Listing содержит ссылку на MainListing через столбец mainListingId.Хотя сущность MainListing содержит коллекцию сущностей Listing.

Когда дело доходит до удаления сущностей, я применяю мягкое удаление на уровне БД.В каждой таблице есть удаленный столбец (bool), указывающий, удалена строка или нет.Следовательно, нет необходимости полностью удалять записи об удалении из БД.

Проблема, с которой я сталкиваюсь, связана с процессом удаления в спящем режиме.Определенная выше настройка прекрасно работает с другими настройками отношений сущностей.Однако в случае использования, определенном выше, при выполнении удаления выполняется оператор обновления, который устанавливает fk_id=null, что приводит к разыменованию записей.В этом примере следующее происходит mainListingId=null, таким образом разрывая связь между Listing и MainListing.Это не предполагаемое поведение, так как я все еще хотел бы иметь возможность извлечь сущность MainListing и все связанные с ней листинги после удаления.

Примечание: Это происходит только в следующих случаях -Отношения @OneToMany - ссылки на столбцы Id, а не на сущность (фрагмент кода ниже)

@Entity
@SQLDelete(sql = "update main_listing set deleted=1 where id=?")
MainListing { 
    ...
    @OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
    @JoinColumn(name = "main_listing_id", referencedColumnName = "id")
    @Where(clause = "deleted=false")
    var listings: List<Listing> = emptyList(),
    ...
}

@Entity
@SQLDelete(sql = "update listing set deleted=1 where id=?")
Listing {
    ...
    @Column(name = "main_listing_id", updatable = false)
    var mainListingId: Long? = null,
    ...
}

1 Ответ

0 голосов
/ 19 апреля 2019

Решением этой проблемы было добавить следующее к родительской сущности

@JoinColumn(... nullable=false, insertable=false)

Вышеуказанное служит следующим целям

  • решает проблемуссылка на проблему при удалении
  • не влияет на поведение обновления, так как updatabale = true по умолчанию
  • не влияет на вставки, поскольку значение по умолчанию внешнего ключа равно нулю при вставке
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...