2010-01-10 119 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