2014-02-07 2 views
4

Взаимодействие, если я хочу удалить ребенка, нужно ли явным образом удалить этот ребенок из коллекции родителя или просто удалить его достаточно?JPA - удалить ребенка из отношений OneToMany

Например, Person и Phone. У каждого человека много телефонных номеров. Если я хочу, чтобы удалить один номер телефона от человека, этого достаточно:

EntityManager.remove(phone); 

Или мне нужно, чтобы это заранее:

Person.getPhone().remove(phone); 

Не говоря уже, то CascadeType установлен в MERGE.

+1

Вы попробовали? –

+1

Я хочу понять это, а не пытаться. –

+0

Спасибо за ваш полезный и дружеский комментарий. Я понятия не имел, что есть документация. –

ответ

7

Вам необходимо бесплатно снять Phone из коллекции phones, этого недостаточно, чтобы удалить его с помощью EntityManager.

С другой стороны, может быть достаточно использовать orphanRemoval, поэтому, если вы удалите объект из коллекции, он автоматически удаляется. Что-то вроде:

@OneToMany(mappedBy="person", orphanRemoval="true") 
private List<Phone> phones; 

Смотрите также: http://docs.oracle.com/cd/E19798-01/821-1841/giqxy/index.html

Cascade.REMOVE только удаляет дочерний объект, если родительский объект удаляется, а также. Cascase.MERGE не имеет ничего общего с этой проблемой.

+0

Вы правы, cascadeType не имеет значения в этом случае использования. Ссылка на объект будет по-прежнему действительна и найдена в ссылках на коллекции, она будет находиться только в удаленном состоянии. – atamanroman

+0

Точно. Я думаю, что исключение с нарушением ограничения ссылочной целостности будет выбрано, если вы не удалите его из коллекции. –

3

Не уверен, что MERGE достаточно для того, чтобы сущности были удалены каскадом, вам, вероятно, придется также определять каскадирование DELETE и в зависимости от того, как данные сопоставляются (с или без промежуточной таблицы между ними), это может быть даже необходимо применить удаление сирот.

Если вы не применяете каскадирование для удаления, а используете JPA-запрос или entityManager.remove(), то, конечно же, это хорошая идея вручную выселить его из коллекции oneToMany. Причина проста: вы можете вручную удалить ее из базы данных, но это не означает, что она автоматически удаляется из коллекции, поэтому для срока службы родительского объекта она все равно будет ссылаться на сущность, которая не должна существовать больше. Вещи становятся странными, когда вы также случайно меняете состояние указанного объекта.

+0

Я думаю, что OP спрашивает об удалении с другой стороны. –

Смежные вопросы