2009-07-07 7 views
0

Comme je l'ai compris MVC, la logique du modèle doit également entrer dans le modèle lui-même - en faisant de chaque objet une entité auto-contenue. Cela signifie que les méthodes d'une classe doivent avoir des déclencheurs et des chaînes d'actions. Par exemple, l'utilisation de setZipCode (zip) dans une classe Person peut déclencher une action où elle recherche le code postal d'une table zip vers city, puis définit setCity (city) de la même manière.Implémentation de MVC lors de l'utilisation de JPA

Tout cela semble bien et tout, mais que se passe-t-il lorsque vous prenez une implémentation JPA dans l'image? Comme je le vois, les setters et getters de la classe doit être propre de toute logique supplémentaire, comme l'implémentation JPA les utilise pour construire les objets. Vous ne pouvez donc pas appeler setCity dans setZipCode. Nous avons fait le tour de ce projet avec lequel je travaille en déplaçant toute la logique spécifique au modèle vers la couche contrôleur. Au lieu d'appeler la personne directement dans ce cas, nous appellerions PersonController.setAddressInfo (zip) qui gère les deux, ou quelque chose comme ça. Peut-être une option plus agréable serait d'avoir des fonctions transitoires à l'intérieur de l'entité elle-même qui le fait. Donc voici ma question: ai-je manqué quelque chose de fondamental dans les principes de MVC ou JPA, ou MVC ne peut-il pas être totalement implémenté lors de l'utilisation d'une couche ORM? Serait-il préférable que les setters génériques et les getters soient privés pour JPA et que les classes aient une API publique séparée, transitoire, destinée aux développeurs? (Hibernate ne semble pas se soucier d'accéder à des méthodes privées pour une raison quelconque.)

Parmi les implémentations JPA nous utilisons Hibernate dans le projet, mon collègue a utilisé EclipseLink dans un autre projet et j'ai lu quelque chose sur OpenJPA dernièrement.

Répondre

2

J'ai fait l'expérience, que vous devrez probablement ajouter une autre couche entre les objets de domaine JPA réels et votre contrôleur de cadre MVC. Documentation sur JPA les appelle Data Access Objects (OTI) Idéalement, les objets d'affaires JPA ne sont que POJO (objets Plain Old Java) avec des accesseurs qui n'ont pas de la logique et les OTI mettre en œuvre des opérations telles que

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

J'ai travaillé avec des architectures qui avaient même un autre couche de service au-dessus du DAO Layer où DAO étaient spécifiques à une entité de modèle de domaine et la classe de service a fait la gestion des transactions et a appelé les méthodes DAO correspondantes. Ces services pourraient interagir avec plusieurs OTI afin que le service pourrait offrir des méthodes comme

City MainService::getCityByZipCode(ZipCode zc); 

Personnellement, je pense que la couche de service ne soit pas obligatoire lorsque vous par exemple utiliser des ressorts annotations @Transactional dans vos OTI et offrir des méthodes appropriées comme

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

-je utiliser pour séparer le modèle dans une couche d'affaires, qui appelle d'autres objets d'affaires, les transactions contrôles et tout ce genre de choses, et la couche de valeurs (mince POJOs).

Un ORM peut s'intégrer parfaitement avec la couche de gestion sans rompre le paradigme MVC.

La version JPA fonctionne comme indiqué précédemment.

Cordialement!