Аннотации Hibernate. Каскадное удаление двунаправленных отношений с ненулевым внешним ключом.

При выполнении удаления для Order (родительского) hibernate пытается каскадно удалить дочерние элементы. Вместо того, чтобы сначала просто удалить дочерние элементы, он пытается обнулить внешние ключи, затем удалить родительский элемент, а затем удалить дочерние элементы.

Есть ли способ изменить мою конфигурацию, чтобы разрешить сначала удалить дочерние элементы, а затем удалить родительский элемент? Обойти этап обнуления внешнего ключа?

Таблицы и соответствующие столбцы

Заказ

id - PK, int, не нуль

OrderResult

id - PK, int, не null order_id - FK, int, not null

Спецификация сущности

Заказ

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "CLOrderID")
public List<OrderResult> getOrderResults() {
    return orderResults;
}

OrderResult

@ManyToOne
@JoinColumn(name = "CLOrderID", nullable = false)
public Order getOrder() {
    return order;
}

person John Helfert    schedule 15.05.2012    source источник
comment
Вы пробовали установить для необязательного атрибута ManyToOne значение false?   -  person JB Nizet    schedule 15.05.2012
comment
Да, я просто попробовал еще раз. Та же проблема, невозможно вставить значение NULL в столбец «CLOrderID».   -  person John Helfert    schedule 15.05.2012


Ответы (1)


проблема с вашим кодом в том, что Cascade DELETE настроен правильно. Вот почему, когда вы удаляете пользователя, действие DELETE не выполняется каскадом, то есть также удаляется OrderResult. Вместо этого он обновляет OrderResult, устанавливая значение ссылки на NULL, поскольку Order был удален.

Чтобы исправить это, измените свой Order класс:

@OneToMany(cascade = CascadeType.ALL, mappedBy="order")
public List<OrderResult> getOrderResults() {
    return orderResults;
}

Надеюсь, это поможет.

person Khue Vu    schedule 17.09.2012
comment
На самом деле это не работает, я попытался установить каскад для всех с помощью отношения mappedBy, но это все еще вызывает проблему ограничения. - person John Helfert; 04.12.2012