Делаю небольшой веб-проект на java + gwt в целях самообучения.
Связь с БД через JDBC. Hibernate не использую.
Сейчас пишу слой DAO и возникли вопросы.
Возьмем, к примеру, три сущности: User, Role, Permission. У User есть 1 Role, у Role есть 1 или более Permission.
Если перенести все в ООП модель, то будет класс User, в нем ссылка на Role, а у Role будет список Permission.
Теперь, предположим, нам надо достать из БД какого-то User'a. Получается, что придется тянуть еще и все остальное (Role и список Permission). Role еще ладно, там всего 1-запись надо достать. А вот Permission целый список. При этом, я привел самый простой пример, ведь может цепочка может быть намного длиннее.
Другой вариант, это не делать поле Role в классе User, а сделать просто поле, которое будет хранить первичный ключ соответствующей роли.
Второй вариант какой-то не красивый и не соответствует модели.
И я как-то пока не могу придумать гибкого, красивого решения.
Второй вариант какой-то не красивый и не соответствует модели.
Ваш вариант вполне хорош при условии что это первичный ключ уже содержит достаточно информации.
Но если есть необходимость в модели используйте шаблон Proxy. Т.е. создавайте частично инициализированные объекты и делайте запросы для загрузки остальных данных по необходимости.
Как я понимаю, Вы используете реляционную БД, а значит Вы можете обойтись 1 запросом, судя по всему пермишинов у одного юзера так же не будет много, а значит проблемы как таковой то и нет.
Если все же не хочеться фетчить всю инфу о юзере сразу, то можно сделать Прокси имплементации для тех сущностей которые не хочеться таскать за собой, этот подход будет хорош если Вам нужно выбирать много юзеров сразу и у юзеров есть инфы больше чем будет занимать прокси инстанс.
Вы правильно поняли. 1 запросом можно обойтись, и да, пермишенов у юзера максимум около 10. Но этот вариант я взял для примера, т.к. он всем понятен. Вся БД у меня состоит более чем из 20 таблиц и связи могут получится достаточно глубокие)