2011-06-17 55 views
4

我正在開發一個爲客戶端和瀏覽器提供服務的服務器系統,我決定使用JPA處理數據庫存儲的OR/Mapping。這導致實體Bean類暴露給客戶端,因此我嘗試通過使用值對象和數據傳輸對象來避免這種設計。這意味着我需要POJO,以及在不同的系統輪胎上交換POJO和Entity Bean類的機制。如何將實體Bean轉換爲值對象?

我的問題是,有沒有任何成熟的設計模式或EJB指定的服務可以自動做到這一點?我真的很討厭設計一些難以解耦和更新的POJO - Entity Bean一對一映射。

在此先感謝

回答

2

你可能想看看Dozer,使用反射來映射基於字段名稱豆豆映射。它爲您提供了一些防止更改的保護措施,因爲如果一個類發生更改,您總是可以手動指定映射,但是您希望保持映射的類相同。

+0

感謝您的幫助,artbristol,我現在正在學習Dozer,看看是否符合我的需求。同時,我想到JavaCompiler和Reflection動態地做所有事情:) – Korben 2011-06-17 10:39:42

4

這導致實體Bean類 暴露給客戶端,因此我嘗試通過使用值對象和數據傳輸對象來避免此類設計。

爲什麼?什麼問題證明了這種殘酷的代碼重複?

「數據傳輸對象」和「值對象」名稱的錯誤用法是EJB 2實體Bean必需的反模式,以避免過多的服務器往返。

如果你使用JPA,你不需要實體bean。您的實體 POJO,將它們暴露給客戶絕對沒有錯 - 事實上這是關於JPA最好的事情之一。

+0

是的,我不得不承認我提出了一個非常糟糕的問題。我是EJB的新手。感謝你的信息。 – Korben 2011-06-17 14:47:41

+1

因爲視圖不需要知道它基於的每個實體或數據庫表。所以如果你改變你的持久性方法,你不必重寫你的用戶界面。與使用O/R映射抽象數據庫調用的原因相同。 – BillR 2012-06-14 16:27:16

+0

@BillR:*當然*你的觀點必須知道它所基於的實體,否則它不能做任何事情。而且這不像是視圖會意外地使用反射來訪問JPA註釋並依賴它們。有趣的是,你應該提及O/R映射 - 這就是JPA。因此,「改變數據庫中期項目」案例已經被覆蓋 - 儘管這從來沒有真正發生過,當然也不是使用OR映射器的主要原因。它們用於避免編寫大量重複的CRUD代碼。 – 2012-06-14 21:04:32