У меня довольно простые отношения между родителями и детьми, которые выглядят так:
Почтовые серверы имеют n папок.
Папки могут иметь n (под) папок.
Папки имеют ссылку на свою родительскую папку, а также на сервер электронной почты, к которому они принадлежат.
Мои файлы сопоставления выглядят так:
MailServer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 02.05.2011 12:32:52 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
<class name="test.MailServer" table="MAILSERVER">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<bag name="folders" table="FOLDERS" lazy="false" inverse="true" cascade="all-delete-orphan">
<key column="MAIL_SERVER_ID"></key>
<one-to-many class="test.Folder" />
</bag>
</class>
</hibernate-mapping>
Folder.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 04.05.2011 15:02:31 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
<class name="test.Folder" table="FOLDERS">
<id name="id" type="long" access="field">
<column name="FOLDER_ID" />
<generator class="native" />
</id>
<many-to-one name="mailServer" column="MAIL_SERVER_ID" not-null="true" />
<bag name="folders" table="FOLDERS" lazy="false" inverse="true" cascade="all">
<key column="PARENT_FOLDER_ID" not-null="false"></key>
<one-to-many class="test.Folder" />
</bag>
<many-to-one name="parentFolder" column="PARENT_FOLDER_ID" />
</class>
</hibernate-mapping>
Проблема, с которой я столкнулся, заключается в следующем.
Допустим, у меня есть следующая иерархия:
- MyMailServer
Folder1
- Folder2
Subfolder
Folder3
Когда я звоню hibernateSession.save(mailServerInstance);
или hibernateSession.update(mailServerInstance);
, Hibernate правильно сохраняет все в базе данных. Идентификаторы родительского столбца заполнены правильно. То же самое для всех других ссылок.
НО при загрузке данных Hibernate перезагружает иерархию папок следующим образом:
- MyMailServer
Folder1
Folder2
Subfolder
Folder3
Я понимаю причину: подпапка имеет ссылку на свой MailServer и, таким образом, Hibernate рекламирует ее там, а не в папке, к которой она принадлежит.
Но как мне решить эту проблему?
Заранее спасибо!