使用JPA的时候实现MVC(Implementing MVC when using JPA)

2019-09-17 19:33发布

正如我所理解的MVC,该模型的逻辑也应该进入模式本身 - 让每一个对象了一个独立的实体。 这意味着一个类的方法必须有触发和行动链。 例如,通过在Person类使用setZipCode(ZIP),在其中查找从拉链到城市台的邮政编码,然后可能会触发一个动作设置在同一setCity(市)。

这一切似乎都不错,一切,但是当你把一些JPA实现进入画面,会发生什么? 在我看来,这个类的getter和setter方法必须是干净的所有额外的逻辑,作为JPA实现使用这些建立的对象。 因此,你不能叫setCity内setZipCode。 我们已经走了围绕这是一个项目,我通过移动所有特定模型的逻辑控制器层的工作。 而不是直接在这种情况下,呼叫的人,我们称之为PersonController.setAddressInfo(ZIP),它可以同时处理,或这样的事情。 也许一个更好的选择是有做这个实体本身内部的瞬态功能。

使用ORM层时,我错过了在MVC或JPA的prinicples一些基本的东西,或不能MVC只是没有得到充分实施:因此,这里是我的问题吗? 它会更好,如果通用的getter和setter方法是私有的JPA和类将有一个单独的公共的,短暂的,API意味着开发商? (休眠似乎并不介意访问出于某种原因私有方法。)

我们在项目中使用Hibernate JPA实现的,我的同事已经使用的EclipseLink在另一个项目,我最近读一点关于OpenJPA的。

Answer 1:

我做了经验,你可能会与实际JPA的域对象和你的MVC框架控制器之间添加另一个层。 关于JPA文学呼唤他们的数据访问对象(DAO的)理想情况下,JPA的业务对象只是的POJO(简单Java对象)的getter和setter方法没有任何逻辑和DAO的执行类似操作

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

我曾与架构,甚至有DAO层之上的另一个服务层,在那里的DAO是具体到一个域模型实体和服务类做交易管理,并要求相应的DAO方法。 这些服务可以与几个DAO的相互作用,使得该服务可以提供类似的方法

City MainService::getCityByZipCode(ZipCode zc);

我个人认为,当你比如说用温泉@Transactional注释在你的DAO,并提供适当的类似方法,服务层是不是强制性的

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


Answer 2:

我使用该模型分为业务层,调用其他的业务对象,控制交易和所有的东西,值层(薄的POJO)。

一个ORM可以与业务层很好地集成,而不打破了MVC模式。

JPA的版本工程如前所述。

问候!



文章来源: Implementing MVC when using JPA