У меня есть три сущности, которые выглядят следующим образом:ошибки внешнего ключа ограничения в JPA
@Entity
class EntityA{
@OneToMany(cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true)
private List<EntityB> _candidates = null;
}
@Entity
class EntityB{
@OneToOne
private EntityC _comp;
}
@Entity
class EntityC{
...
}
EntityB
имеет свойство типа EntityC
. Когда экземпляр instanceC
из EntityC
удален, все экземпляры instancesB
из EntityB
, ссылающиеся на него, также должны быть удалены из экземпляров EntityA
, содержащих instancesB
.
Могу ли я достичь такого поведения с помощью аннотаций? В текущем состоянии кода, при удалении объекта EntityC
я получаю следующее исключение:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа терпит неудачу
Я думаю, вам нужно определить больше отношений. Вы должны добавить отношения '@ ManyToOne' в' EntityB', который ссылается на 'EntityA'. Вы также должны добавить '@ OneToOne' в' EntityC', который ссылается на 'EntityB'. Затем вы можете добавить атрибуты 'CascadeType' ко всем вашим отношениям. – jahroy
Привет @jahroy, спасибо за ответ! Этот подход, похоже, не работает. Я получаю тот же тип ошибки. Разве нет проблемы, что и «EntityA», и «EntityC» ссылаются на «EntityB»? Я не могу удалить 'A' или' C' без сбоя внешнего ключа. –
Если 'B' содержит' C', вы не можете удалить 'C' до тех пор, пока' B' не будет удален. Вот как работают внешние ключи ... Я не уверен, что вы можете изменить это, используя аннотации. Кроме того, я не знаю, хотите ли вы этого. Я думаю, вам нужно написать некоторую бизнес-логику, чтобы управлять своими отношениями. Все это говорит, я не думаю, что мне достаточно эксперта, чтобы дать вам авторитетный совет здесь. – jahroy