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,
...
}