Метод session.update (obj) в Hibernate делает дочерние объекты временными (в отношениях родитель / потомок) - PullRequest
1 голос
/ 30 мая 2011

У меня есть отношение папок / родителей к папкам, которое выглядит следующим образом:

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

Используя Hibernate, я вызываю session.update(folder) для этих папок.

Если в такой папке нет подпапок, все работает нормально.

НО, когда в папке есть подпапки, session.update(folder) сделает подпапки (и) переходными (идентификатор подпапки изменится с 4 на 0!).

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

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

<?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" lazy="false" inverse="true" cascade="none">
            <key column="PARENT_FOLDER_ID" not-null="false"></key>
            <one-to-many class="test.Folder" />
        </set>

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

        <property name="name" column="FOLDER_NAME" />

        <property name="rootFolder" column="IS_ROOT_FOLDER" type="boolean" not-null="true" />

        <property name="path" column="FOLDER_PATH" />

        <property name="type" column="FOLDER_TYPE" />

        <property name="fullPath" column="FULL_PATH" unique="true" not-null="true" />

    </class>
</hibernate-mapping>

Обновление: Вот код Java, который я использую для обновления папки:

public class DatabaseController{

    private SessionFactory  sessionFactory  = null;

    public void updateFolder(Folder folder){
        Session session = null;
        Transaction transaction = null;
        try {
            session = getSession();
            transaction = session.beginTransaction();
            session.update(folder);
            transaction.commit();
        } catch (Exception e) {
            rollback(transaction);
            closeSession();
        } finally {
            closeSession();
        }
    }

    /*
     * Returns the Hibernate session
     */
    private Session getSession() {
        if (_session == null) {
            _session = getSessionFactory().getCurrentSession();
        }
        if (_session.isOpen() == false) {
            _session = getSessionFactory().openSession();
        }
        return _session;
    }

    /**
     * Returns the session factory
     * 
     * @return The session factory
     */
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Ответы [ 3 ]

0 голосов
/ 30 мая 2011

ваш код: ОБНОВЛЕНИЕ 2

 <set name="childFolders" table="FOLDERS" lazy="false" inverse="true" cascade="none">
            <key column="PARENT_FOLDER_ID" not-null="false"></key>
            <one-to-many class="test.Folder" /> // **this should point to child table not itself**
  </set>

вы дали неправильное отношение кораблю мой код:

<set cascade="all, delete-orphan" name="childTable" order-by="param" inverse="true">
  <key>
    <column name="p_id"/>
  </key>
  <one-to-many class="com.a.data.ChildTable"/>
</set>
0 голосов
/ 03 июня 2011

Я нашел решение проблемы. Изменение следующих строк в моем файле отображения hibernate устранило проблему:

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

Я думаю, удаление ключа not-null="false" добилось цели.

0 голосов
/ 30 мая 2011

Это правильно

у вас есть cascade = "none" в ваших определениях набора.

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-transitive

Вам необходимо установить каскад ="копи-обновление".

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