Как аккуратно сопоставить 2 ассоциации «один к одному» в режиме гибернации

#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 файл сделал свое дело! Спасибо.