1.
Учитывая трансформацию DAO - VO; полезно ли это, зависит от того, как используется Hibernate. Если вся обработка веб-запросов выполняется в одном сеансе Hibernate, вам не нужно использовать отдельные VO.
Если, однако, ваш уровень DAO открывает сеанс для извлечения объекта и закрывает сеанс до того, как вы закончите использовать DAO, у вас могут возникнуть проблемы с коллекциями и ссылками на другие объекты. Существует большая вероятность того, что они загружаются лениво, а это означает, что сеанс должен быть открыт при запросе этих свойств.
Короче говоря, перед тем, как вы начнете расставаться с этими VO, внимательно изучите транзакции базы данных и границы сеансов.
3.
Что касается использования VO в форме; если VO хорошо отображается на JSP, я бы сказал, почему нет? Меня либо впечатлило, что модель данных так близко соответствует процессу, который она поддерживает, и немного подозрительно, что база данных не была нормализована (что может создавать или не создавать проблемы в будущем).
Возвращаясь к 1. Если вы используете DAO с отложенной загрузкой и коллекциями, помните, что сеанс базы данных должен также включать фазу JSP, поскольку DAO будет считываться на этой фазе.
Сервисный уровень должен иметь возможность узнать, какие объекты базы данных следует изменить, и идентификатор предназначен именно для этого. Сервисный уровень должен будет извлечь DAO из базы данных и записать поля из VO в DAO, хотя ему, очевидно, не нужно обновлять идентификатор DAO с помощью идентификатора VO:)
Что вам нужно из запроса, так это идентификатор поля внешнего ключа. Поскольку это исходит от клиента, вам, вероятно, следует проверить в бизнес-логике, существует ли объект с таким идентификатором.
В зависимости от того, принимает ли VO идентификатор стороннего объекта или требует объекта, вам следует либо:
- установить идентификатор или
- получить посторонний объект в виде VO по идентификатору, используя сервисный уровень и
положить его в свой VO, и сохранить его с помощью сервисного слоя
Ваш бизнес-уровень отвечает за переводы, поскольку сервисный уровень занимается только поиском и хранением объектов. И текст, или идентификатор - это не объекты, а идентификаторы объектов. Уровень обслуживания может
предлагать средства поиска, но для этого не требуется контекстная информация.
И если я правильно прочитал ваш вопрос, ваши VO обращаются к другим объектам в базе данных по id. В этом случае вы вводите идентификатор. Если вы получаете String от клиента, вы должны найти его на бизнес-уровне (используя сервисный уровень) и поместить идентификатор найденного объекта в VO. Или, если идентификатор не найден, верните достойное сообщение об ошибке.
В качестве заключительной записки; не трогай вещь DAO-VO, если ты не знаешь, что делаешь ДЕЙСТВИТЕЛЬНО ХОРОШО. Hibernate - это мощный и сложный инструмент, который обманчиво прост в использовании. Вы можете очень легко совершать ошибки, и их очень трудно найти. И клиенты, и начальство, похоже, не ценят появление ошибок в вещах, которые раньше работали.
Кстати; Мой консерватизм в DAO-VO связан с исправлением проблем, связанных с аналогичными проблемами в переходах EJB2 и Hibernate. Дьявол кроется в деталях, и изменение того, как вы справляетесь со слоем данных, является серьезным рефакторингом, даже если он выглядит как кусок пирога.