| « GAE + GWT + Spring Security = une équation compliquée ! | Coup d'oeil sur JavaFX » |
Google App Engine et JPA : un support limité
Comme tout bon geek qui se respecte, voila deux semaines que je joue avec le Google App Engine.
Mon idée de base était simple : dans quelle mesure une application existante peut-elle être portée dans les nuages de GAE ?
Etant modeste et fainéant, j'ai tenté d'adapter l'application de démonstration Gilead, basée sur Hibernate.
Error in meta-data for net.sf.gilead.sample.domain.Message.id: Cannot have a java.lang.Long primary key and be a child object (owning field is net.sf.gilead.sample.domain.User.messageList)
D'après la doc, les clés entières ne peuvent être utilisées que pour les entités sans associations, sinon il faut utiliser une instance de la classe Key, ou une String encodée. Ayant pour but de faire fonctionner mon application avec GWT, j'opte donc pour la seconde solution :
@Id
Dernière petite tracasserie, j'ai eu le malheur de renseigner l'entity-name de ma classe (
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;@Entity(name="Message")), ce qui génère des erreurs aux messages peu explicites...
Ouf, mon mapping est enfin terminé. Avouez que l'on est loin de l'objectif de JPA, un standard portable sur toutes les implémentations !
EJBQL, lui aussi loin du compte...
Première info : il faut passer le nom complet de la classe dans vos requête, sinon DataNucleus soulève une ClassNotResolvedException :
"select user from net.sf.gilead.sample.domain.User user where user.login=:login"
De même, la clause 'select' est obligatoire (comme quoi, je doit être intoxiqué par Hibernate :>>)
Par contre, comme indiqué dans la doc, il faudra apprendre à se passer des jointures.
Ouch ! Moi qui avait pour habitude de définir mes chargement par ce biais, je suis bon pour charger explicitement mes associations une à une en appelant les getters qui vont bien.
Conclusion
Autant l'avouer, je suis un peu refroidi par le support JPA fourni par Google App Engine. L'implémentation retenue manque de souplesse, et s'avère relativement contraignante à mettre en oeuvre.
A ce point, il me semble inenvisageable de porter une application JPA existante sous Google App Engine sans un gros travail. Par contre, une fois connue la bonne méthode, utiliser JPA pour développer une nouvelle appli GAE me semble relativement pertinent (autant que de devoir apprendre JDO...)
Note importante : Comme indiqué par Erik dans les commentaires, ces limites proviennent pour l'essentiel des limites du DataStore de GAE, et non de DataNucleus, dont le support JPA est bel et bien certifié.
Et la suite...
Pour autant, mon périple n'est pas fini. Si j'ai à peu près réussi à dompter DataNucleus, il reste un problème de taille : l'envoi des entités JPA/DataNucleus vers GWT echoue systématiquement avec le message suivant :
Type '[Ljava.lang.Object;' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.
Problème de sérialisation GWT et de classes "enrichies" (enhanced), autant dire le syndrome Hibernate4GWT B)
Je suis assez surpris que ce point n'aie jamais été testé par les équipes GAE et/ou GWT, et je travaille pour l'instant avec l'un des auteur de DataNucleus pour voir comment contourner ce problème. Stay tuned !
5 commentaires
et le fait de ne pas pouvoir visualiser/editer, la base de données en local est frustrant (question de temps aussi)
Merci pour l'article en tt cas
Contrairement, au plugin AppEngine, le DataNucleus JPA RDBMS plugin est bien complet et compliant avec JPA.
http://www.datanucleus.org/development/test/jpa_tck.html
Pour info, pour celles et ceux qui ne seraient pas trés à l'aise avec l'anglais, j'ai mis à disposition une traduction française de la doc de Google App Engine ici:
http://www.gae-en-francais.fr
Seb.
http://blog.developpez.com/java_rest/p7839/java/google-app-engine-de-la-grele-dans-les-n