2009-07-07 34 views
0

正如我所理解的MVC,模型的逻辑也应该进入模型本身 - 使每个对象成为一个独立的实体。这意味着类的方法必须具有触发器和动作链。例如,通过在Person类中使用setZipCode(zip),可以触发一个操作,在该操作中,它将邮政编码从zip到城市表中查找,然后将setCity(city)设置为相同。使用JPA时实现MVC

这一切似乎都很好,但是当你将一些JPA实现插入图片时会发生什么?正如我所看到的,类的setter和getter必须清除所有额外的逻辑,因为JPA实现使用这些来构建对象。因此你不能在setZipCode中调用setCity。我们已经解决了这个问题,通过将所有特定于模型的逻辑移动到控制器层来处理这个项目。在这种情况下,不是直接调用Person,而是调用PersonController.setAddressInfo(zip)来处理两者,或者类似的东西。也许更好的选择是在实体本身内部具有瞬态函数。

所以,这里是我的问题:我有没有在MVC或JPA的原理中遗漏一些基本知识,或者不能在使用ORM层时完全实现MVC?如果泛型setter和getter对于JPA是私有的并且这些类将为开发人员提供单独的公共,临时API,那么它会更好吗? (由于某种原因,Hibernate似乎并不介意访问私有方法。)

在项目中使用Hibernate的JPA实现中,我的同事在另一个项目中使用了EclipseLink,并且我一直在阅读关于OpenJPA的一些信息最近。

回答

2

我提出了这样的经验,您可能需要在实际的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); 
0

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

一个ORM可以与业务层很好地集成而不会打破MVC范例。

JPA版本的工作原理如前所述。

问候!