2013-06-18 1 views
1

У меня есть три сущности, которые выглядят следующим образом:ошибки внешнего ключа ограничения в 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: Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа терпит неудачу

+0

Я думаю, вам нужно определить больше отношений. Вы должны добавить отношения '@ ManyToOne' в' EntityB', который ссылается на 'EntityA'. Вы также должны добавить '@ OneToOne' в' EntityC', который ссылается на 'EntityB'. Затем вы можете добавить атрибуты 'CascadeType' ко всем вашим отношениям. – jahroy

+0

Привет @jahroy, спасибо за ответ! Этот подход, похоже, не работает. Я получаю тот же тип ошибки. Разве нет проблемы, что и «EntityA», и «EntityC» ссылаются на «EntityB»? Я не могу удалить 'A' или' C' без сбоя внешнего ключа. –

+1

Если 'B' содержит' C', вы не можете удалить 'C' до тех пор, пока' B' не будет удален. Вот как работают внешние ключи ... Я не уверен, что вы можете изменить это, используя аннотации. Кроме того, я не знаю, хотите ли вы этого. Я думаю, вам нужно написать некоторую бизнес-логику, чтобы управлять своими отношениями. Все это говорит, я не думаю, что мне достаточно эксперта, чтобы дать вам авторитетный совет здесь. – jahroy

ответ

2

Ваша таблица B имеет внешние ключи как для A, так и для C с вашими текущими сопоставлениями, которые необходимо поддерживать. Поскольку fk to A контролируется A OneToMany до B, эта проблема не будет слишком большой проблемой, если вы удалите ссылку A на B, когда вы удаляете B, просто чтобы сохранить ваши кэшированные объекты в синхронизации изменений. С другой стороны, отношение к C требует от вас разыменования C из B, прежде чем оно может быть удалено, или удалить B, иначе fk в таблице B останется, нарушив ограничение. Как говорится в комментариях, при удалении сущностей вам потребуется некоторый уровень управления отношениями.

+0

Я считаю, что обычной практикой является сохранение этих отношений в методах сессионного компонента без состояния (если вы используете EJB). – jahroy