LINUX.ORG.RU

Hibernate - связь 1 к 1

 


0

1

Всем привет. Как можно организовать связь 1 к 1 через cfg.xml файлы? Я нашел на одном ресурсе, что можно тэгом one-to-one ее организовать. Ну вот, чтобы много не читать, сделал короткий пример с созданием таблиц
president.cfg.xml:
<hibernate-mapping>
<class name=«President» table=«president»>
<id name=«id» column=«id» type=«int»>
<generator class=«native» />
</id>
<property name=«name» column=«name» type=«string» />
<one-to-one name=«country» class=«Country» />
</class>
</hibernate-mapping>

country.cfg.xml:
<hibernate-mapping>
<class name=«Country» table=«country»>
<id name=«id» column=«id» type=«int»>
<generator class=«native» />
</id>
<property name=«countryName» column=«countryname» type=«string» />
<one-to-one name=«president» class=«President» />
</class>
</hibernate-mapping>

В консоли получаю ответ
Hibernate: create table country (id integer not null auto_increment, countryname varchar(255), primary key (id))
Hibernate: create table president (id integer not null auto_increment, name varchar(255), primary key (id))
Насколько я понимаю, связь осуществляется посредством внешних ключей, которые Hibernate не создал. Или я плохо понимаю в связях, или это неверная конфигурация связи 1 к 1. Как я представляю, в связи 1 к 1 нужно использовать вспомогательную колонку также, как и в связи 1 ко многим, но только сделать эту колонку UNIQUE, чтобы туда нельзя было добавлять одинаковые значения. В принципе, можно повесить внешний ключ на айдишник одной таблицы и связать ее с айдишником другой. Но тут вообще не создаются внешние ключи. В чем проблема?

В принципе, можно воспользоваться тэгом <many-to-one> и прописать там параметр unique = «true», но это похоже на какой-то костыль.

global_silence ()
Ответ на: комментарий от monk

Ну все равно должен быть внешний ключ тогда. А тут просто создались 2 таблицы отдельные, которые друг от друга не зависят никак. Если предположить, что Hibernate как-то скрыто это делает... Но опять же, если существует связь между таблицами по колонке id, то, насколько я знаю, если таблица 1 зависит от таблицы 2 по полю id, то в таблицу 1 нельзя добавлять те айдишники, которых нет в таблице 2. А я могу спокойно в обе таблицы добавлять любые айдишники.

global_silence ()
Ответ на: комментарий от crutch_master

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

global_silence ()
Ответ на: комментарий от crutch_master

Аа вот окей. Не обновил страницу после исправления. Ща заценю, спасибо)

global_silence ()
Ответ на: комментарий от global_silence

Если 1 к 1 связь очень редкая, то, как по мне, это не причина просто на нее забить

Ну, ты понимаешь, что она не просто так очень редкая.

то скажите, как через аннотации хотя бы можно ее реализовать

https://www.callicoder.com/hibernate-spring-boot-jpa-one-to-one-mapping-example/

crutch_master ★★★★★ ()
Ответ на: комментарий от global_silence

если таблица 1 зависит от таблицы 2 по полю id, то в таблицу 1 нельзя добавлять те айдишники, которых нет в таблице 2. А я могу спокойно в обе таблицы добавлять любые айдишники.

В такой постановке задачи вообще ничего добавить нельзя. У тебя таблицы ведь друг от друга зависят.

Я предположил, что соединение по полю id в том смысле, что если в обоих таблицах есть строки с одинаковым id, значит есть соединение, а если только в одной, значит пустое значение.

Попробуй несколько объектов создать и посмотри на записи в таблицах

monk ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.