2012-04-22 70 views
1

我目前正在使用Java-EE6(GlassFish 3.1.2,MySQL Server 5.1和Netbeans 7.1.1)開發3層應用程序。Java-EE6:如何設計在各層之間傳遞的@Entity?

目前該項目包括3個項目:

  • 企業應用程序/ EJB的:外牆控制數據庫
  • 的Java類庫的實體:@Entity註解類,代表了數據庫模型(該項目服務器資源的JNDI查找(以EJB的遠程訪問)
:由EE-應用程序和胖客戶機以交換層之間的實體實例)
  • J2SE胖客戶機共享

    在創建/修改/刪除實體時更新客戶端的GUI我決定通過實現一個Topic來使用JMS,其中每個客戶端在啓動時訂閱並且EJB容器上的消息驅動bean用作發佈者。

    現在我面臨着以下重大問題:

    • 我連着生命週期監聽器(@PostUpdate等),然後應該發佈更新消息訂閱的客戶機的實體對象。實體類駐留在class-lib項目中,而發佈者駐留在EE-app中。問題是,EE-app引用了class-lib項目,反之則不然(因爲循環項目引用是不允許的)。因此實體類中的生命週期回調方法沒有對EE-app中消息驅動的發佈bean的引用。

    這是一個比較與設計有關的問題&這樣問你,如果這是基本設計與Java-EE 6的3層應用程序的正確方法?

    如果可能的話,我希望避免DTO/DAO,以儘可能降低複雜性,並且應用程序不會產生沉重的網絡流量。

    感謝您的提前提前!

  • 回答

    0

    我通過在所有圖層之間直接傳遞@Entity對象來解決問題。通過激活靜態編織(使用eclipse-link作爲jpa提供程序),我可以使用延遲讀取來處理繁重的關係。爲了僅從客戶端獲取特定的重要關係,我使用加載組來定義在通過將實體從實體管理器分離的網絡上序列化之前應該預取的惰性關係。反之,再次發送一個實體到服務器,我只是在服務器端的Facade上使用EntityManager.merge(T)來把實體恢復到管理狀態。即使對於非常複雜的數據層次結構,這種設計也能正常工作

    +0

    你的意思是說,你發送@ Entity到胖客戶端,離開EJB服務器上下文嗎?但由於關係是代理,因此這些實體是不可序列化的,您如何設法在沒有DTO的情況下做到這一點? – edutesoy 2012-10-24 08:51:31