Я использую среду 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 должен соответствовать только ОДНОЙ таблице, а связанные объекты должны быть агрегированы на уровне приложения. У этого есть накладные расходы на выполнение нескольких выборок объектов из БД, верно? Слишком запутались в правильном подходе, извините за такое длинное объяснение!