2010-01-10 5 views
1

J'ai une application web java construit sur Stuts2/Google Guice/JPA. Il utilise Hibernate comme fournisseur JPA. Je voudrais ajouter un support pour qu'il puisse être utilisé sur Google App Engine. Bien sûr, je rencontre des problèmes avec les requêtes et les mappages. Tels que Many-to-Many et joint ne pas être pris en charge.Google App Engine et de garder le soutien autonome

Je suis en train de trouver la meilleure solution pour garder mon application capable d'être autonome. Par exemple, sin a tomcat/jetty sur n'importe quelle base de données prise en charge par le fournisseur JPA ou Google App Engine avec datanucleus en tant que fournisseur.

Une solution que je pensais serait d'utiliser JPA pour mes implémentations autonomes et JDO pour App Engine de Google. Évidemment, cela nécessiterait que j'annote mes objets modèles avec les annotations JPA et JDO et que j'écrive une autre implémentation pour la couche DAO.

Y a-t-il d'autres bonnes solutions que d'autres ont essayé?

Répondre

1

Je pense que votre approche est bonne. Je pense qu'une bonne architecture de design est la meilleure approche. Vous verrez très probablement beaucoup de variance dans la couche DAO. Une bonne conception verrait une interface DAO, alors chaque accès au modèle spécifique aurait sa propre implémentation de cette interface, par ex. JpaMyObjectDAO, JpaGAEObjectDAO etc. Aussi comme vous siad, App Engine a des exigences particulières lorsqu'il s'agit de déclarer vos classes d'entité. Peut-être pourriez-vous avoir différentes versions des classes d'entités (chacune étant conforme à son schéma de stockage comme App Engine ou Hibernate), puis avoir une représentation DTO commune pour vos couches supérieures à utiliser.

+0

Je dispose déjà d'une bonne séparation des interfaces DAO et des interfaces de service. Il est donc assez facile de changer d'implémentation. On dirait que c'est le chemin que je vais devoir prendre. Je pense toujours à utiliser des objets DTO au lieu de mes objets de modèle. À l'heure actuelle, j'utilise les objets du modèle jusqu'à la vue. – Ruggs

1

Vous pouvez déplacer vos requêtes à une configuration XML. De cette façon, vous pouvez avoir des requêtes pour un SGBDR dans une configuration et vos requêtes pour BigTable dans une autre configuration.

Une autre idée est que DataNucleus est un fournisseur JPA aussi bien. Vous pourriez probablement faciliter votre développement en en faisant votre fournisseur JPA principal sur GAE et votre conteneur de servlet. Les vendeurs d'APP ont souvent de très légères différences entre ce qu'ils font avec leurs métadonnées, ce qui peut vous éviter des maux de tête.

+0

Qu'en est-il de la gestion des annotations multiples? – Ruggs

+0

Malheureusement, GAE ne peut tout simplement pas gérer les relations plusieurs-à-plusieurs en ce moment. Le mieux que vous puissiez faire est de transporter des collections de clés sur chaque classe et de gérer les collections dans votre couche DAO/Service. Si vous êtes content d'accéder uniquement à des choses via la couche DAO/Service, plutôt que d'avoir beaucoup d'accès aux propriétés ('Service.getContactByCategory (category)' par opposition à 'category.getContacts()'), vous devriez pouvoir -impliment le DAO pour qu'il charge les clés lorsque vous appelez. – Drew

+0

Ceci est une application existante, et l'utilisation du service comme vous l'avez suggéré n'est pas une option. Dans les deux cas, je devrais avoir une implémentation différente du service, donc ce serait plus que simplement mettre des requêtes dans différents fichiers XML. – Ruggs