Ленивая загрузка полей DTO весной - PullRequest
6 голосов
/ 29 января 2009

У меня есть проект, который использует Spring и разбит на пару десятков DAO и связанных DTO. Я использую JdbcTemplate, но не намного, так как именно уровень абстракции меня устраивает.

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

Базовая базовая логика: 1. Если поле не нулевое, верните его значение и выйдите 2. Свяжитесь с соответствующим DAO и получите соответствующие DTO. 3. Храните их до следующего раза.

Он работает отлично, за исключением того, что мои скромные DTO связаны с целой кучей DAO и не так уж POJOey.

Другой запах кода появляется, если я помещаю логику в DAO, поскольку она будет обрабатывать как CRUD для своих DTO, так и Lazy Loading, и, насколько я понимаю, объекты должны нести одну ответственность.

Я надеюсь, что существует относительно простой подход Spring, который я могу использовать для внедрения объекта Lazy Loader между DAO и DTO, чтобы достичь этого, но любое другое решение будет работать для меня.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 29 января 2009

Легче обернуть DAO вокруг DAO ... это зависит от того, какую часть модели вы хотите донести. DTO, как правило, не используются для того, чтобы соединить их со многими, как два или более отдельных вызовов базы данных / дао. В этом случае вы действительно хотите ОРМ. Так как вы ищете дао ответ ......

Ничто не мешает вам связать DAO, чтобы дать вам один DTO. Проще подключить DTO к DAO. Это на самом деле не сервисный уровень, это просто строительные блоки DAO. Таким образом, у вас может быть PersonDao и TelephoneNumberDao. У человека может быть более одного телефонного номера, поэтому у вас также может быть PersonModelDAo, который использует PersonDao и TelephoneNumberDao для своей работы.

В качестве альтернативы, избегайте всей проблемы и не пытайтесь сопоставить 1-N между человеком и номером телефона на уровне DTO. Просто сделайте так, чтобы ваш пользовательский интерфейс делал правильные звонки нужным DAO. Мне на самом деле это нравится больше, когда я использую DTO.

3 голосов
/ 29 января 2009

Обычно вводится сервисный уровень, который охватывает ваши DAO и решает такие проблемы. Если вы боитесь, что вы добавляете слишком много стандартного кода в свои DTO, чтобы справиться с отложенной загрузкой, возможно, использование AOP может быть способом для достижения этой цели. Возможно, вы захотите взглянуть на AspectJ и переплетаться во время компиляции или во время загрузки. Поскольку вы будете изменять байт-код напрямую, вам не придется беспокоиться о повышении производительности AOP на основе прокси.

...