сопоставление «один к одному» с использованием уникального ограничения, не работающего должным образом - PullRequest
2 голосов
/ 12 апреля 2011

Я пробую это простое однонаправленное отношение один-к-одному

Персона ----> Адрес

с использованием сопоставления многие-к-одному с уникальным ограничением.

Вот так выглядит мое сопоставление в Person.hbm.xml:

<class name="Person" table="PERSON">
<many-to-one name="address" column="ADDRESS_ID" cascade="all" not-null="true" unique="true"/>

Я думаю, что это должно позволять использовать только один уникальный адрес на человека - никакие два человека не могут иметь общий адрес.

Итак, следующий код должен завершиться ошибкой.Но в этом коде Hibernate позволяет обоим Джонам оставаться по одному адресу.

    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    Address address = new Address("Bond Street", "London", 121212);
    Person person1 = new Person("John Doe", address);
    Person person2 = new Person("John McClane", address);
    session.save(person1);
    session.save(person2);
    transaction.commit();
    session.close();

Пожалуйста, дайте мне знать, что мне здесь не хватает?

1 Ответ

3 голосов
/ 12 апреля 2011

Прочитайте http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e7576, и найдите описание «многие к одному» в п. 5.1.7.1.В нем говорится:

уникально (необязательно): включает генерацию DDL уникального ограничения для столбца внешнего ключа.Допуская, чтобы это было целью свойства-ref, вы можете сделать кратность ассоциации один к одному.

Это означает, что он используется инструментом генерирования схемы базы данных Hibernate для добавленияуникальное ограничение.Если вы не используете его, вы должны добавить это ограничение самостоятельно.

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