Дизайн отношений сущностей с JPA2 - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть две сущности, User и UserSetting.Очевидная связь между этими двумя аспектами заключается в том, что пользователь является первым объектом оценки, который содержит набор / список пользовательских настроек, поэтому при загрузке пользователя также загружаются настройки.Например, User 1 -> * UserSetting

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

Мое текущее «решение» - включить пользователя в объект UserSetting, ноэто неправильно, так как устанавливает отношение UserSetting * -> 1 User, который чувствует, что UserSetting является доминирующей сущностью.Это лучшее решение?

Предполагая, что мое текущее решение - лучшее, что я могу получить, если удаление Пользователя все еще происходит правильно?

1 Ответ

0 голосов
/ 03 октября 2011

Здесь есть 2 пункта

  1. Во-первых, если ваша сущность пользователя имеет ассоциацию с UserSettings и эта ассоциация может содержать множество членов, которые не нужны все время, правильная вещьдля этого нужно настроить его как lazyLoaded по умолчанию (через конфигурацию отображения JPA2), а затем принудительно извлекать его только тогда, когда вам нужно (т. е. в тех ситуациях, которые вы упоминали, когда вам нужны значения этой ассоциации на отдельном пользовательском объекте).Посмотрите на "join fetch", чтобы увидеть, как это сделать, это должно быть что-то вроде:

    ВЫБЕРИТЕ ОТ ОТ ПОЛЬЗОВАТЕЛЯ u ПРИСОЕДИНЯЙТЕСЬ u.userSettings

  2. Если есть толькоПодмножество этих UserSettings, которые часто требуются, вы можете сделать две ассоциации в сущности User, такие как userSettingsMain и userSettingsExtra, которые по умолчанию загружаются лениво, и просто соединить выборку, которая вам нужна для определенной отдельной сущности User.Или, как более сложный способ, вы можете создать сопоставление Map для пользовательских настроек и иметь разные ключи для важных пользовательских настроек, а также дополнительные (например, i1, i2, ... e1, e2 и т. Д.), А затемохотно выбирайте только те наборы ключей, которые необходимы, но это работает (по крайней мере, на данный момент) с EclipseLink JPA2, реализация Hibernate просто вызывает большое исключение для ассоциаций Map (см. мой вопрос здесь: Hibernate JPQL - запрос дляKEY () в ошибке ассоциации карты на этом)

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