2016-06-28 2 views
0

Я изучаю отношения JPA (@OneToOne, @ManyToOne, ...), и когда я разговариваю с людьми о том, как они моделируют свои сущности, тем больше я сбиваюсь с толку. Вот пример со вчерашнего дня:JPA и как думать об отношениях

Допустим, у нас есть связь между Person и Address. БД хранит Address.id как FK в таблице Person как «address_id». Являются ли эти отношения OneToOne или OneToMany? Я слышал, что люди спорят друг с другом, и у обоих есть веские причины, почему они так себя чувствуют.

Один человек утверждал, что он «многопользовательский», поскольку адрес_ид не является уникальным для каждой записи. Тот же адрес_ид можно было использовать снова и снова в таблице Person. Он утверждает, что действительно иметь OneToOne, FK в таблице Person должен быть уникальным, как указано в спецификации JSR ».

Еще отдельные государства, что «когда вы думаете о Person записи, они будут иметь более одного Address Если нет, то это OneToOne;? Зачем усложнять дело»

Я запутался, что верно. С одной стороны, первый человек смог поднять спецификацию JSR и рассказать мне об этом. С другой стороны, у меня есть разработчик с более чем 20-летним опытом (и он очень уважаем) говорит мне, чтобы он был простым.

Может кто-то пожалуйста, помогите прояснить это для меня

Спасибо!

ответ

1

Я возьму ассоциацию от Лица, чтобы Адрес.

Данное лицо не может иметь более одного адреса, так как его связанная таблица имеет столбец внешнего ключа по адресу.

Таким образом, это может быть OneToOne или ManyToOne.

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

Если это OneToOne, вы должны убедиться, что это действительно OneToOne, и что два человека не могут использовать один и тот же адрес. Самый эффективный и простой способ сделать это - добавить уникальное ограничение столбца address_id таблицы person. Но Hibernate не волнует, установили ли вы это ограничение или нет.

Ваш «другой человек» ошибается. Если два человека могут использовать один и тот же адрес, тогда он должен быть многопользовательским. Не один. Представьте, что вы делаете это двунаправленной ассоциацией: поскольку адрес может использоваться несколькими лицами, у вас будет одна ассоциация OneToMany между Адресом и Лицом, которая будет обратной связи между Person и Address. И обратная связь OneToMany должна быть ManyToOne, а не OneToOne.

0

У нас есть человек и адрес. Нам нужно определить взаимосвязь между ними. Вы могли видеть отношения двух различных способов, как показано ниже

  1. от человека Адрес
  2. От Адреса для лица

1.From Люди в Адрес

Take экземпляр или строку адреса из вашей таблицы и спросите себя, может ли эта конкретная строка адресов быть связана с несколькими лицами. Если да, то Сторона лица много, если ни одна сторона не является стороной. Итак, на этом этапе вы определили, является ли человек Многим или Один

Теперь подберите экземпляр или строку лица из вашего стола и спросите себя, может ли это конкретное лицо иметь более одного адреса. Если да Адресная сторона отношения - это много другой адресной стороны.

Ваш пример

Человек имеет внешний ключ, ссылки на идентификатор Адрес

На основе этой информации Lets мозговой штурм

Может ли один человек имеет более чем одну родственную адрес? ?? Каждый человек в таблице лица имеет внешний ключ (адрес_ид), ссылающийся на строку адреса. Учитывая, что address_id не является многозначным, мы можем сказать, что у одного Лица может быть только один адрес, связанный с ним. Таким образом, адресная сторона отношения ОДИН

Может ли один адрес принадлежать более чем одному человеку?

Как известно, у человека есть адрес_ид, который является иностранным ключом для адреса. И нет ограничений, указывающих, что address_id уникален. То есть столбец address_id может иметь одинаковое значение для нескольких строк в таблице Person. Можно сказать, что несколько человек могут иметь одинаковый адрес. Так Person сторона отношений является МНОГО

В конце концов мы приходим к выводу, что отношения от человека к ADDRESS является МНОГО К ОДНОМУ

Примечание: - если внешний ключ address_id в лицо таблице имеет уникальный связанное с ним ограничение, в этом случае несколько человек не смогут ссылаться на один и тот же адрес, следовательно, делает Личность стороной отношения ONE. Таким образом, отношения стали бы взаимно однозначными

0

В некоторых БД нет прямых опций для установления отношений один к одному. Вы можете заставить его использовать уникальное ограничение, как указано в @JB Nizet, или использовать Person.id в качестве первичного ключа для таблицы Adress, а также внешний ключ для таблицы Person.

Если вы этого не сделаете, вы не сможете гарантировать, что отношения 1: 1 или 1: n, не зная значений данных, с которыми вы работаете.

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