Удаление элемента от one-many набора (Java + В спящем режиме + Struts),

Я не могу удалить дочерний объект из базы данных. От 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 я делаю отображение правильно, и согласно этому ТАК вопрос, у меня есть правильная логика. Я посмотрел на всем протяжении Интернета и, может казаться, не нахожу ничто больше.

Что я делаю неправильно? Помогите!Спасибо.


Примечания по версиям

Всему несколько лет:

  • Java 1.4.2
  • SQL Server 2005
  • Будьте в спящем режиме 3.0.5
  • Struts 1.2.7
  • Tomcat Apache 5.0.28

5
задан Community 23 May 2017 в 12:08
поделиться

3 ответа

Если вы не перекрыли метод равных () , объект, вероятно, не найден в списке, потому что он был отсоединен и теперь является другим экземпляром Отказ Вот почему удалить не работает. Тогда даже если работает Удаление , объекты являются повторной каскакдой, потому что они все еще существуют в коллекции. Вот что делать:

  • , либо переопределить равных () MOSHCODE () ) метода (ы), используя либо ID (просто) Или какие-то ключ (более подходящие) (более подходящие) (поисковые колокочки для подсказки для переопределения этих двух методов) и оставьте только GetChildren (). Удалить (дочерние)
  • Итерации по поводу собрания детей в первом петле, Как это:

     итератор  I = form.getDeleteiTems (). ITERATOR ();
    в то время как (i.hasnext ()) {
      Ребенок ребенок = i.next ();
      для (iTerator  IT = Parent.getChildren (). ITERATOR ();) {
      if (child.getid (). равно (it.next (). getid ()) {
      It.remove ();  // это удаляет ребенка из базовой коллекции
      }
      }
     }
     
6
ответ дан 14 December 2019 в 19:14
поделиться

В этом случае класс 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

-2
ответ дан 14 December 2019 в 19:14
поделиться

Я не уверен, что вызывает это поведение в гибернации, вы можете сначала погрузиться . Отдельно удалять ребенка не является несессуаром. Обновленный код должен выглядеть;

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. Работа с объектами

1
ответ дан 14 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: