Обычно я работаю над трехуровневыми приложениями, использующими Hibernate в уровне персистентности, и я стараюсь не использовать классы модели домена в уровне презентации. Вот почему я использую шаблон дизайна DTO (Data Transfer Object)
.Сохранение Hibernate Lazy loading в шаблоне проектирования объектов передачи данных
Но у меня всегда есть дилемма в моем объектно-ориентированном сопоставлении. Я теряю ленивую загрузку, или создаю сложность кода, вводя фильтры для вызова или не модели домена getters
.
Пример:Рассмотрим DTO UserDto, что соответствует сущности пользователя
public UserDto toDto(User entity, OptionList... optionList) {
if (entity == null) {
return null;
}
UserDto userDto = new UserDto();
userDto.setId(entity.getId());
userDto.setFirstname(entity.getFirstname());
if (optionList.length == 0 || optionList[0].contains(User.class, UserOptionList.AUTHORIZATION)) {
IGenericEntityDtoConverter<Authorization, AuthorizationDto> authorizationConverter = converterRegistry.getConverter(Authorization.class);
List<AuthorizationDto> authorizations = new ArrayList<>(authorizationConverter.toListDto(entity.getAuthorizations(), optionList));
userDto.setAuthorizations(authorizations);
...
}
OptionList
используется для фильтрации отображения и отображения только что хотел.
Хотя последнее решение допускает ленивую загрузку, но оно очень тяжелое, поскольку в сервисном слое должен быть указан optionList
.
Есть ли лучшее решение для сохранения отложенной загрузки в шаблоне проектирования DTO?
Как это работает? В большинстве случаев, когда вы используете DTO/3-ярус, транзакция закрывается, когда вы выходите из уровня обслуживания. Как ваша ленивая загрузка при работе? Если вы используете шаблон открытого сеанса в представлении, почему бы не использовать напрямую спящие объекты, которые уже реализуют ленивую загрузку? Вы можете иметь несколько объектов для одной и той же таблицы, использовать специализированный для пользовательского интерфейса, который вы устанавливаете в режиме только для чтения при загрузке. – Thierry
Спасибо за ваш ответ Тьерри. Фактически ленивая загрузка выполняется в сервисном слое. Уровень презентации просто сообщает сервисному слою, что он должен быть восстановлен с помощью 'optionList', который затем используется для вызова или отсутствия получателя модели домена. Таким образом, это предотвращает вызов базы данных, если это не обязательно. Пример службы:. '@Transactional \t общественного UserDto FindByName (имя String, окончательное OptionList ... optionList) { \t \t возвращение GetConverter() toDto (dao.findByName (имя), optionList); \t} ' –
ОК, я понимаю ваш вопрос лучше сейчас – Thierry