Дилемма проектирования гибернации; родительско-дочерние отношения с адресной ссылкой

#java #hibernate #entity-relationship

#java #гибернация #сущность-отношение

Вопрос:

У меня есть существующий дизайн объекта. Существует Individual сущность. A Guardian или a Minor хранятся как Individual . Если вы Minor используете, вы назначили ноль или более опекунов. Эта связь хранится в другом объекте.

Существует дополнительное требование; добавить флаг, чтобы показать, что Guardian Address он должен использоваться для Minor , если установлена связь. Можно снять этот флаг позже. Если флаг снят, будет использоваться существующий адрес, и никакие изменения в адресе опекуна не будут перезаписывать адрес несовершеннолетнего.

Связь между Minor и Guardian сохраняется как

(minor_individual_id, guardian_individual_id, type_of_the_relationship)

где type_of_the_relationship может иметь такие значения, как «legal» и т. Д..

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

Объект address содержит индивидуальный идентификатор и адрес для отдельного лица в одной таблице.

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

Структура базы данных:
индивидуальная (таблица / объект)

Возраст идентификатора (в зависимости от возраста, вы рассматриваетесь как несовершеннолетний)

GuardianRelationShip (таблица / сущность)
Minor_Individual_Id
Guardian_Individual_Id

Адрес (таблица / объект)
Individual_Id
Адресная
строка1 Город
-государство

Если у Minor вас есть идентификатор с Individual идентификатором 2, а у a Guardian есть идентификатор с Individual идентификатором 1. Это будет выглядеть так

 Id Age (Individual)
1   40 Guardian
2    5 Minor

Minor Guardian (GuardianRelationShip)
2     1

IndividualId City State (Address)
1            LA    CA
2            NY    NY
  

Как только они будут связаны, идея состоит в том, что адрес для второстепенного «индивидуального идентификатора 2» будет изменен на NY / NY.

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

Ответ №1:

У вас есть AddressEntity . Я бы создал IndividualEntity.address и адрес несовершеннолетнего могли ссылаться на тот же адрес, что и один из опекунов (кстати, несколько опекунов тоже могут жить по одному адресу!). После этого вы можете проверить, равен ли адрес несовершеннолетнего одному из адресов опекуна.

Я не понимаю, какую проблему решает флаг. Пожалуйста, предоставьте больше информации, а также некоторый код для иллюстрации ваших сущностей и отношений.

Комментарии:

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

2. Итак, у вас есть fk в адресе для ссылки на человека? Не наоборот? В этом случае вы все равно можете сделать ссылку из MinorEntity на адрес. (Или не для адреса, а для RelationshipEntry, чтобы гарантировать, что несовершеннолетний ссылается на адрес своего опекуна)

3. Несовершеннолетний и опекуны не являются сущностями. Это просто определение пользователем отношений между двумя людьми. Я постараюсь лучше обновить редактирование, чтобы показать существующую erd.

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

5. Проблема заключается в изменении модели данных. Высшее руководство опасается изменения модели данных и возникновения проблем, поэтому ему приходится работать с сосуществующим дизайном.

Ответ №2:

Разрешить Individual запись без соответствующей Address записи. Если вы хотите ограничить его только хранителями, разрешайте только тот случай, когда запись для Individual таблицы не имеет соответствующего соответствия в GuardianRelationship.Minor столбце. Если адрес равен нулю, найдите guardian и используйте этот адрес.

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

Комментарии:

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

2. @EnderWiggin Вставка адреса для младшего является переопределением. Если это null, родительский адрес. Если другой адрес, переопределение.

3. Я вижу только пару проблем; если вы не находите адрес, вы предполагаете, что адрес связан. Это означает, что они могут попытаться ввести адрес для младшего, который разорвет ссылку. Как вы решаете угловой случай, о котором вы упоминаете? Также как вы узнаете, какой адрес опекуна использовать?

4. Будет работать некоторая высокоуровневая логика для копирования адреса при удалении. Если у вас есть дело с двумя опекунами, вы можете затем запросить таблицу домохозяйств / адресов и связанную таблицу индивидуальных адресов. Это устраняет нулевое соображение, о котором я говорил выше.