У меня есть следующая модель сущности.
@Entity
@Table(name="product")
public class ProductEntity {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
...
@OneToMany(mappedBy = "productEntity", cascade = CascadeType.ALL)
private List<ProductAddonEntity> productAddonEntities;
}
@Entity
@Table(name="product_addon")
public class ProductAddonEntity {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
...
@ManyToOne()
@JoinColumn(name = "addon_id")
private ProductEntity addonEntity;
}
Я хочу удалить продукт, и это удаление должно также удалить все объекты ProductAddon, связанные с этим продуктом. Поэтому я объявляю связь один ко многим со всеми каскадными типами.
Но когда я пытаюсь удалить какой-либо продукт, в начале Hibernate пытается установить нулевой addon_id в таблице product_addon. Но этот столбец имеет ненулевое ограничение, поэтому удаление невозможно.
Поэтому я добавил в аннотацию @ManyToOne параметры
@JoinColumn(name = "addon_id", nullable = false, updatable = false)
Но теперь hibernate просто пытается удалить продукт, прежде чем удалять сущности product_addon, связанные с этим продуктом. И это удаление не выполняется из-за ограничения внешнего ключа (Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено).
В чем здесь проблема? Это приложение также использует liquibase, поэтому внешние ключи генерируются не Hibernate. Например, внешний ключ для addon_id не имеет действий при удалении, но я думаю, что hibernate не нуждается в этих действиях, потому что он работает на более высоком уровне данных