#java #hibernate
#java #переход в режим гибернации
Вопрос:
В настоящее время я пытаюсь создать два простых взаимно однозначных сопоставления, используя Hibernate, но почему-то это работает не так, как я хочу.
Мой основной класс называется MailAccount, и его отображение выглядит следующим образом:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 26.04.2011 14:49:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping package="test.account">
<class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">
<id name="id" column="MAIL_ACCOUNT_ID">
<generator class="native" />
</id>
<one-to-one name="incomingServer" cascade="all" />
<one-to-one name="outgoingServer" cascade="all" />
</class>
</hibernate-mapping>
Файл сопоставления сервера выглядит следующим образом:
<?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.server.MailServer" table="MAILSERVER">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<one-to-one name="mailAccount" class="test.account.MailAccount" foreign-key="MAIL_SERVER_ID"></one-to-one>
</class>
</hibernate-mapping>
Теперь, если я позволю Hibernate создавать таблицы, я получу практически то, что я хочу: таблицу «MailAccount» со столбцом «MAIL_ACCOUNT_ID» и другую таблицу «MailServer», также со столбцом для идентификатора.
Если я вызываю session.save(mailAccountInstance);
, режим гибернации корректно сохраняет данные в таблицах.
НО как только я пытаюсь загрузить данные в экземпляр MailAccount, Hibernate загружает только свойство «incomingServer» в новый экземпляр MailAccount, а свойство outgoingServer пусто.
Я также не понимаю, как Hibernate объединяет обе таблицы вместе, поскольку таблица «MailServer» не сохраняет идентификатор MailAccount, к которому принадлежит каждый сервер, в качестве внешнего ключа.
Как я могу это исправить?
Заранее спасибо!
PS: Я довольно новичок в Hibernate, так что не сильно ругайте меня за очевидные ошибки 🙂
Ответ №1:
Я предлагаю взглянуть на главу Сопоставления ассоциаций в справочном руководстве по Гибернации. Для двунаправленного взаимно однозначного сопоставления предлагается использовать <one-to-one>
на одном конце и <many-to-one unique="true">
на другом конце.
Комментарии:
1. Установка unique = «true» приводит к исключению из-за повторяющейся записи (в данном случае идентификатора MailAccount), но в целом ваше предложение работает. Замена сопоставления «один к одному» на «многие к одному» в MailServer.hbm.xml файл сделал свое дело! Спасибо.