2014-02-14 3 views
3

Согласно книге Pro JPA 2 основное различие между однонаправленным @ManyToOne и @OneToOne является то, что в @OneToOne:JPA однонаправленный @OneToOne vs @ManyToOne с Hibernate - без разницы?

только один экземпляр исходного объекта может ссылаться на тот же экземпляр целевого объекта. Иными словами, экземпляр целевого объекта равен , который не используется совместно с экземплярами исходного объекта. В базе данных это эквивалентно наличию ограничения уникальности для столбца внешнего внешнего ключа (то есть столбца внешнего ключа в таблице исходных сущностей).

Дело в том, что когда я создаю такое сопоставление на сущности и позволяю Hibernate создавать схему, нет никакого уникального ограничения, созданного вообще. Зачем? Из-за этого для меня нет никакой разницы между @ManyToOne и @OneToOne, если я должен явно определять уникальное ограничение для отображения. Я могу сделать это для них обоих, и это не имеет значения. Это правильное поведение?

ответ

5

Нет причин использовать OneToOne, если ассоциация является ManyToOne и наоборот. Используйте соответствующую аннотацию, которая отражает реальность мощности ассоциации. Не делать этого было бы только запутать разработчиков приложения, если бы не Hibernate.

Независимо от того, ограничена ли уникальность источника в базе данных или нет, ничего не изменяет для Hibernate. По моему опыту, Hibernate делает создать уникальное ограничение в случае OneToOne, а если нет, то вы должны его создать (я бы не использовал Hibernate для создания схемы в любом случае, за исключением быстрого «n грязного» демонстрационное приложение).

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

+3

«Не делать этого было бы только путать разработчиков приложения» - это лучшая причина, о которой я могу думать! Можете ли вы указать версию Hibernate, которая создает ограничение с помощью @OneToOne? – user1071076

+0

Все, что я недавно использовал, IIRC. 3.6 +. Это также может зависеть от вашего диалекта базы данных. –

+0

hmm, Oracle XE, это могло быть так. Будет проверяться с помощью MySQL ... – user1071076

3

Важный фрагмент текста: this equates to having a uniqueness constraint. Это не означает, что поставщик JPA поместит для вас уникальное ограничение на две таблицы. Это просто означает, что на уровне базы данных строка в одной таблице будет отображаться только в одной строке в другой таблице.

Существует существенное различие между One to One и One to Many, мощность связи. Значение в отношении One To Many сущность с одной стороны отношения может быть сопоставлена ​​(через внешний ключ с большой стороны) ко многим сущностям на многих сторонах отношения. В отношении One to One объекты просто сопоставляются с другим одиноким объектом.

Смежные вопросы