Я не могу удалить дочерний объект из базы данных. От org.apache.struts.action.Action.execute()
метод, я удаляю ребенка из родителя List
, и также вызов session.delete(child)
. Я упростил код ниже и только включал то, чему я верю, чтобы быть relavent.
...
...
Transaction tx = session.beginTransaction(); //session is of type org.hibernate.Session
try {
Parent parent = (Parent) session.get(Parent.class, getParentId());
Iterator i = form.getDeleteItems().iterator(); //form is of type org.apache.struts.action.ActionForm
while(i.hasNext()){
Child child = (Child) i.next();
session.delete(child);
parent.getChildren().remove(child); //getChildren() returns type java.util.List
}
session.saveOrUpdate(parent);
tx.commit();
} ...
Я попробовал только session.delete(child);
и я попробовал только parent.getChildren().remove(child);
и с обеими строками, всеми без успеха. Нет никаких ошибок или вызванных исключительных ситуаций или чего-либо вида. Я уверен, что этот код называют (я даже использовал System.out.println();
прослеживать, что происходит), но база данных не обновляется. Я могу добавить детей, использующих подобный код, свойства ненабора редактирования существующих детей, отредактировать свойства родителя, все это работы, просто не удалив!
Согласно Быть в спящем режиме FAQ я делаю отображение правильно, и согласно этому ТАК вопрос, у меня есть правильная логика. Я посмотрел на всем протяжении Интернета и, может казаться, не нахожу ничто больше.
Что я делаю неправильно? Помогите!Спасибо.
Всему несколько лет:
Если вы не перекрыли метод равных ()
, объект, вероятно, не найден в списке, потому что он был отсоединен и теперь является другим экземпляром Отказ Вот почему удалить
не работает. Тогда даже если работает Удаление
, объекты являются повторной каскакдой, потому что они все еще существуют в коллекции. Вот что делать:
равных ()
(и MOSHCODE ()
) метода (ы), используя либо ID
(просто) Или какие-то ключ (более подходящие) (более подходящие) (поисковые колокочки для подсказки для переопределения этих двух методов) и оставьте только GetChildren (). Удалить (дочерние)
Итерации по поводу собрания детей в первом петле, Как это:
итератор I = form.getDeleteiTems (). ITERATOR ();
в то время как (i.hasnext ()) {
Ребенок ребенок = i.next ();
для (iTerator IT = Parent.getChildren (). ITERATOR ();) {
if (child.getid (). равно (it.next (). getid ()) {
It.remove (); // это удаляет ребенка из базовой коллекции
}
}
}
В этом случае класс child является владельцем обратного соотношения, Hibernate будет смотреть на родительскую ссылку дочернего, чтобы определить, существует ли еще это соотношение. Так как вы не устанавливаете родительское отношение нулевым, связь существует, и дочернее отношение не может быть удалено. Попробуйте сделать
parent.getChildren().remove(child);
child.parent = null;
session.delete(child);
Также удалите not-null="true" из отображения родительских свойств.
Лучшее, что можно сделать при работе с обратными ассоциациями, это обновить обе стороны в Java-коде, таким образом вы сможете продолжать работать с объектами в памяти и вам не придётся беспокоиться о том, какой стороне принадлежит отношение.
Похожая ситуация обсуждается здесь: http://simoes.org/docs/hibernate-2.1/155.html
Я не уверен, что вызывает это поведение в гибернации, вы можете сначала погрузиться
. Отдельно удалять ребенка
не является несессуаром. Обновленный код должен выглядеть;
Transaction tx = session.beginTransaction(); //session is of type org.hibernate.Session
try {
Parent parent = (Parent) session.get(Parent.class, getParentId());
Iterator i = form.getDeleteItems().iterator(); //form is of type org.apache.struts.action.ActionForm
while(i.hasNext()){
Child child = (Child) session.get(Chile.class, ((Child) i.next()).getChildId());
parent.getChildren().remove(child); //getChildren() returns type java.util.List
}
session.saveOrUpdate(parent);
tx.commit();
} ...
Показать SQL, сгенерированный Hibernate
<property name="show_sql">true</property>
<property name="format_sql">true</property>
Редактировать:
Проверьте это Глава 10. Работа с объектами