Как обработать простое сопоставление между двумя объектами в ORM / Hibernate? - PullRequest
0 голосов
/ 16 февраля 2010

Как лучше всего использовать hibernate в простом сценарии (вопросы в конце поста)

Допустим, у меня есть эта модель данных в коде:

 class UserGroup
 {
 int id;
 String name;
 }

 class User
 {
 int id;
 String userName;
 }

Для классов User и UserGroup таблица базы данных underyling будет выглядеть точно так, как определено в приведенных выше классах.
Теперь пользователь может принадлежать к одной или нескольким группам пользователей.

В таблице базы данных с именем USERGROUPMAP это может быть представлено как:

USERID INT
USERGROUPID INT

В коде, как я буду представлять это отношение? Возможные варианты:

Вариант 1: (класс UserGroup содержит коллекцию принадлежащих ему пользователей)

 class UserGroup
 {
 int id;
 String name;
 UserCollection usersThatBelongInThisGroup;
 }

Вариант 2: (класс User содержит коллекцию групп, к которым он принадлежит)

 class User
 {
 int id;
 String name;
 UserGroupCollection groupsThatIBelongTo;
 }

Вариант 3: (Класс, который представляет таблицу базы данных с именем USERGROUPMAP. Чтобы выяснить, принадлежит ли пользователь группе и т. Д., Этот класс необходимо проверить в коде)

 class UserGroupMap //Class that represents the USERGROUPMAP table.
 {
 int userId;
 int userGroupId;
 }

Вопросы:

(A) Если я использую третий вариант, то в чем преимущество использования hibernate (ведь это просто еще один класс, представляющий таблицу)? Я имею в виду, что я должен иметь возможность определить коллекцию в классе Users или UserGroup, а hibernate должен позаботиться о вставке / обновлении в USERGROUPMAP для меня. Поэтому я думаю, что это исключает вариант 3.

(B) Если я использую 1-й вариант, то какой смысл хранить информацию о группах во 2-м варианте? (так как это может стать избыточным)

(C) Точно так же, если я использую 2-й вариант, тогда какой смысл собирать пользователей в 1-м варианте?

Как решить эту проблему в ORM, например, в режиме гибернации?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010

Вариант 4 (и, как я считаю, Hibernate делает это):

 class UserGroup 
 { 
   int id; 
   String name; 
   UserCollection usersThatBelongInThisGroup; 
 } 

 class User 
 { 
   int id; 
   String name; 
   UserGroupCollection groupsThatIBelongTo; 
 }

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

0 голосов
/ 16 февраля 2010

Для меня первый вопрос: как вы на самом деле используете свои объекты? Вам нужно чаще искать группы для пользователя или пользователей для группы? ИМО, которая должна решить, как вы будете отображать свои объекты.

Hibernate позволяет использовать как 1), так и 2) вместе. Однако также легко написать отдельный запрос для выборки 2), если вы реализуете только 1) в коде (или наоборот). И, конечно же, если вы реализуете и 1), и 2), вам нужно быть осторожным с отклонением от стратегии ленивого извлечения по умолчанию - вы можете легко в конечном итоге загрузить всех своих пользователей и группы с помощью одного активного запроса извлечения.

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