Вопрос передового опыта с сущностями, классами обслуживания и объектами команд - PullRequest
4 голосов
/ 25 октября 2010

Сущности - это классы, которые отображаются непосредственно в нашу базу данных (которую мы используем для Hibernate).

Наши классы обслуживания содержат бизнес-логику с этими сущностями до вызова DAO.

У нас также есть объекты Command, которые являются POJO и относятся к конкретным представлениям. Мне сказали, что сами сущности не должны использоваться в качестве командных объектов, но ответа на вопрос «почему» мне было недостаточно. Я надеюсь, что кто-то здесь может дать мне этот ответ.

Некоторые наши взгляды невероятно просты. Они имеют не больше свойств, чем сами сущности. Мне кажется бессмысленным сопоставлять сущность с командным объектом, который в основном является зеркальным отображением сущности.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Кажется, что может быть некоторая путаница в именах ваших объектов. Командные объекты обычно предоставляют один метод execute () (с параметрами), который работает с данным объектом или доменным объектом для изменения его состояния в соответствии с бизнес-логикой. Это очень аккуратный способ инкапсуляции бизнес-логики в простые объекты, которые имеют очень ограниченную область видимости для изменения других объектов.

Может показаться, что проект, с которым вы работаете, фактически выполняет своего рода мост между объектами передачи данных (DTO или объектами) и объектами значений (объектами VO или объектами Command в вашей системе). Это может быть довольно расточительным, поскольку все, что вы делаете, это копируете одни и те же данные в разные объекты.

Объект доступа к данным (DAO), действующий по шаблону объекта передачи данных (DTO или объект), хорошо известен и обеспечивает хорошее разделение между уровнями. Как правило, Hibernate сопоставляет сущности с базой данных и лениво загружает коллекции в них. Это - то, где большинство проектов срабатывают, потому что они не учитывают правильную инициализацию коллекций, потому что сеанс прошел, как только поток выполнения покидает DAO. Я предполагаю, что «Объекты команд» в JSP на самом деле являются подмножествами сущностей с различными коллекциями, инициализированными с помощью запросов Hibernate.

Я бы посоветовал вам отказаться от «командных объектов» в пользу соответствующим образом инициализированных объектов, которые упростили бы ваш дизайн в одном отношении, но открыли бы вас для потенциальной проблемы в другом. Вам нужно будет тщательно контролировать, как ваши JSP ссылаются на коллекции и инициализируют их. Возможно, вам придется заглянуть в шаблон Open Session In View, чтобы убедиться, что объект Hibernate Session доступен, когда JSP вызывает метод getCollection () для некоторого DTO, который не был инициализирован.

1 голос
/ 25 октября 2010

Я не вижу проблем в повторном использовании объектов модели домена (то, что вы называете сущностями) на всех уровнях вашего приложения - контроллерах, представлениях, классах обслуживания и уровне DAO. Это общий дизайн, который вы часто видите.

Нет проблем с этим тогда и только тогда, когда имеет истинное разделение уровней - контроллеры получают объекты модели из уровня сервиса, сервисный уровень получает объекты модели из уровня DAO, и т.д.

Если у вас есть проект, в котором вы загружаете Employee объекты из базы данных, вызывая manager.getEmployees() из слоя представления, тогда это не будет работать хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...