Разработка DTO, у которых есть отношения внешнего ключа

Я использую среду Java + Spring для веб-приложения. Я не использую ORM-инструменты. Вместо этого я пытаюсь смоделировать отношения db как объекты Java, используя простой шаблон DAO / DTO. Всякий раз, когда DTO точно соответствует одной таблице в базе данных, это очень просто. Но если есть таблицы, которые ссылаются на другие таблицы с использованием внешних ключей, я не уверен, что для этого лучше всего. Искал в Stackoverflow похожие ответы, но не смог найти ни одного из моих потребностей. Я хочу привести очень конкретный пример. Предположим, есть две сущности: Пользователь и Группа. У меня есть User DTO и Group DTO, каждый из которых имеет UserDao (JdbcUserDao) и GroupDao (JdbcGroupDao) соответственно.

Теперь у меня есть отношение в БД, которое связывает пользователя и группу. Один пользователь может принадлежать к нескольким группам.Имя таблицы - User_Group_Association, у которой есть следующее определение БД:

user_id | group_id

Здесь user_id - это внешний ключ, относящийся к пользовательской таблице. Аналогично group_id относится к групповой таблице. Когда я моделирую этот DTO на Java, должен ли я делать что-то вроде этого:

public class UserGroupAssoc {
    private int userId;
    private int groupId;

    //Setters and getters follow
}

ИЛИ должно ли это быть так:

public class UserGroupAssoc {
    private User user;
    private Group group;

    //Setters and getters follow
}

Конкретный вариант использования пользовательского интерфейса: я хочу отображать имена пользователей и соответствующие имена групп, к которым они принадлежат. Примерно так -

Имя -> Имена групп

Кешав -> Администратор, Конечный пользователь, ReportAdmin
Kiran -> ReportAdmin
Pranav -> EndUser

При первом подходе к проектированию DTO мне нужно будет снова получить сведения о пользователях (имена) и сведения о группах (имена) из БД. Во втором подходе мне нужно будет получить объекты User и Group, когда я создаю сам объект UserGroupAssoc.

Вероятно, в третьем подходе я могу разработать UserGroupAssoc DTO следующим образом:

public class UserGroupAssoc {
    private String userName;
    private String groupName;
    private int userId;
    private int groupId;

    //Setters and getters follow
}

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

Какой стандартный подход к реализации этого сценария? Допустимо ли объединение таблиц в дизайне DTO? Некоторые считают, что один DTO должен соответствовать только ОДНОЙ таблице, а связанные объекты должны быть агрегированы на уровне приложения. У этого есть накладные расходы на выполнение нескольких выборок объектов из БД, верно? Слишком запутались в правильном подходе, извините за такое длинное объяснение!

8
задан skaffman 8 January 2012 в 11:44
поделиться