2009-07-07 86 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版本的工作原理如前所述。

問候!