2010-01-10 118 views
1

我有一個構建在Stuts2/Google Guice/JPA上的java web應用程序。它使用hibernate作爲JPA供應商。我想添加支持,以便可以在Google的App Engine上使用它。當然,我遇到了查詢和映射問題。如多對多和連接不受支持。添加Google App Engine支持並保持獨立支持

我試圖想出讓我的應用程序能夠獨立的最佳解決方案。例如,在JPA供應商支持的任何數據庫上使用tomcat/jetty或使用datanucleus作爲供應商的Google App Engine。

我想到的一個解決方案是將JPA用於獨立實現,將JDO用於Google App Engine。顯然這需要我使用JPA和JDO註釋來註釋我的模型對象,併爲DAO層編寫另一個實現。

其他人有沒有嘗試過其他好的解決方案?

回答

1

我認爲你的方法是一個很好的方法。我認爲一個好的設計架構是最好的方法。你很可能會在DAO層看到很多變化。一個好的設計會看到一個DAO接口,那麼每個特定的模型訪問都會自己實現該接口,例如JpaMyObjectDAO,JpaGAEObjectDAO等等。就像你說的那樣,App Engine在聲明實體類時有一些特殊的要求。也許你可以有不同版本的實體類(每一個都符合它的存儲方案,比如App Engine或Hibernate),然後爲你的更高層使用一個共同的DTO表示。

+0

我已經有了DAO接口和服務接口的良好分離,所以更改實現相當簡單。看起來這是我必須採取的道路。我仍在考慮使用DTO對象而不是我的模型對象。現在,我使用模型對象一直到視圖。 – Ruggs 2010-01-10 23:36:23

1

您可以將查詢重定位到XML配置。這樣,您可以在一個配置中查詢RDBMS,並在另一個配置中查詢BigTable。

另一個想法是DataNucleus也是JPA供應商。您可以通過將其設置爲GAE和Servlet容器上的主要JPA供應商來緩解您的開發。 JPA供應商通常在他們對元數據的處理方式上存在細微的差異,這可能爲您節省一些麻煩。

+0

如何處理多對多註釋? – Ruggs 2010-01-10 22:05:29

+0

不幸的是,GAE現在無法處理多對多的關係。您可以做的最好的做法是在每個類上攜帶密鑰集合,並處理DAO /服務層中的集合。如果你只是通過DAO /服務層訪問事物,而不是很多屬性訪問(''Service.getContactByCategory(category)''而不是'category.getContacts()'),那麼你應該能夠重新訪問 - 支持DAO,以便在調用時加載密鑰。 – Drew 2010-01-10 22:10:22

+0

這是一個現有的應用程序,並且使用您建議的服務不是一種選擇。無論哪種方式,我必須有不同的服務實現,所以它不僅僅是將查詢放在不同的XML文件中。 – Ruggs 2010-01-10 23:34:29