Hibernate удаляет дочерние объекты после session.update (parent) - PullRequest
1 голос
/ 02 июня 2011

У меня очень простые родительские / дочерние отношения между объектами типа «Папка», которые выглядят так:

  • Папка может иметь 0-1 родительскую папку.
  • Папка может иметь 0-n дочерних папок (подпапок).

Таким образом, в основном упрощенная версия класса Java Folder выглядит следующим образом:

public class Folder{
    long id;
    Set<Folder> childFolders;
    Folder parentFolder;
    String path;

    // Getter, setter and other (for this question)
    // not relevant properties omitted

    public boolean equals(Object obj){
            if (obj == null) return false;
            if (obj == this) return true;
            if (obj instanceof Folder){
                    Folder folder = (Folder)obj;
                    return folder.getPath().equals(getPath());
            }
            return false;
    }

    public int hashCode(){
            return getPath().hashCode();
    }

}

Мой простойиерархия тестов выглядит следующим образом:

  folder1
  folder2
- folder3
   subfolder3-1

Используя Hibernate, я вызываю:

session.update(folder1);
session.update(folder2);
session.update(folder3);

Первые два вызова успешны.

Последний вызов для folder3 не вызывает исключенияНО он удаляет подпапку 3-1 из внутреннего набора «childFolders» папки 3.Это означает, folder3.childFolders.size() = 0, хотя это было 1 до последнего вызова обновления. Важно: В базе данных по-прежнему существует папка "subfolder3-1"!

Как это может быть?

Вот мой файл сопоставления:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="test.Folder" table="FOLDERS">

        <id name="id" type="long" access="field">
            <column name="FOLDER_ID" />
            <generator class="native" />
        </id>     

        <set name="childFolders" table="FOLDERS" inverse="true" cascade="save-update">
            <key column="PARENT_FOLDER_ID"></key>
            <one-to-many class="test.Folder" />
        </set>

        <many-to-one name="parentFolder" column="PARENT_FOLDER_ID" />

        <property name="path" column="FOLDER_PATH" />
    </class>
</hibernate-mapping>

Ответы [ 3 ]

0 голосов
/ 02 июня 2011

Убедитесь, что вы правильно устанавливаете связь в Java-мире.

  folder3.getChildFolders().add(subfolder3);
  subfolder3.setParent(folder3);
  session.persist(folder3); //cascade here will save subfolder3

Вот документация гибернации.

0 голосов
/ 03 июня 2011

Я добавил еще немного кода отладки и, наконец, нашел решение: прямо перед вызовом session.update(folder3) у меня был крошечный скрытый вызов folder.childFolders.clear(), который, очевидно, вызвал проблему, поэтому проблема не имела ничего общегоСпящий на всех.Просто с моей глупостью.Извините всех за беспокойство и большое спасибо за помощь!

0 голосов
/ 02 июня 2011

Я думаю, что проблема в атрибуте inverse = "true": обратные атрибуты не сохраняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...