Реализация MVC при использовании JPA

Asked
Viewd1845

0

Как я понял в MVC, логика модели должна также входить в саму модель, что делает каждый объект автономным. Это означает, что методы класса должны иметь триггеры и цепочки действий. Например, использование setZipCode (zip) в классе Person может вызвать действие, в котором он ищет почтовый индекс из таблицы zip to city, а затем устанавливает для этого setCity (city) то же самое.

Все это кажется красивым и все такое, но что произойдет, если вы возьмете какую-нибудь реализацию JPA в картину? На мой взгляд, установщики и получатели класса должны быть очищены от всей дополнительной логики, поскольку реализация JPA использует их для создания объектов. Поэтому вы не можете вызвать setCity внутри setZipCode. Мы обошли этот проект, над которым я работаю, переместив всю логику, специфичную для модели, на уровень контроллера. Вместо прямого вызова Person в этом случае мы должны вызвать PersonController.setAddressInfo (zip), который обрабатывает и то, и другое, или что-то вроде этого. Возможно, лучшим вариантом было бы иметь временные функции внутри самого объекта, который это делает.

Итак, вот мой вопрос: пропустил ли я что-то фундаментальное в принципах MVC или JPA, или MVC не может быть полностью реализован при использовании уровня ORM? Было бы лучше, если бы общие сеттеры и геттеры были частными для JPA, а классы имели бы отдельный общедоступный, временный API, предназначенный для разработчиков? (По некоторым причинам Hibernate не возражает против доступа к приватным методам.)

Из реализаций JPA, которые мы используем в проекте, мой коллега использовал EclipseLink в другом проекте, и в последнее время я кое-что читал об OpenJPA.

2 ответов

2

Я убедился, что вам, вероятно, придется добавить еще один слой между фактическими объектами домена JPA и вашим контроллером MVC Framework. В литературе о JPA они называются объектами доступа к данным (DAO) В идеале бизнес-объекты JPA представляют собой просто POJO (простые старые объекты Java) с геттерами и сеттерами, которые не имеют никакой логики, а DAO реализуют такие операции, как

 List<Post> PostDao::searchPostsByDate(Date d);
void PostDao::save(Post p);
 

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

 City MainService::getCityByZipCode(ZipCode zc);
 

Лично я считаю, что уровень обслуживания не является обязательным, когда вы, например, используйте аннотацию Springs @Transactional в ваших DAO и предлагайте подходящие методы, такие как

 @Transactional
City ZipCodeDAO::getCity(ZipCode z);
 
0

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

ORM может хорошо интегрироваться с бизнес-уровнем без нарушения парадигмы MVC.

Версия JPA работает, как указано ранее.

С уважением!