2009-09-04 6 views
0

J'essaie d'effectuer des tests sur une application de mappage unidirectionnel un-à-plusieurs pour grails sur le moteur d'application google (GAE) en utilisant JPA. Le mappage unidirectionnel un-à-plusieurs que je tente de définir se situe entre la classe Utilisateur et la classe Rôle. Malheureusement, je suis coincé. Juste curieux est là tout développeur là-bas en mesure de le faire fonctionner avec succès.Comment configurer le mappage unidirectionnel un-à-plusieurs pour l'application grails sur GAE?

Ce qui suit est mon environnement de développement:

  • Windows XP Professional
  • SDK App Engine 1.2.2
  • Grails 1.1.1
  • Plugins utilisés: 0.8.3 app-engine, gorm- jpa 0,5

Le code source située à:

Les erreurs complètes trace de la pile est ici:

[java] Sep 4, 2009 2:08:42 AM com.google.apphosting.utils.jetty.JettyLogger warn 
[java] WARNING: Failed startup of context [email protected]75b{/,C:\Documents and Settings\limcheekin\.grails\1.1.1\projects\one2many\stage} 
[java] org.springframework.beans.factory.access.BootstrapException: Error executing bootstraps; nested exception is org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.orm.jpa.JpaSystemException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role"; nested exception is javax.persistence.PersistenceException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  at org.codehaus.groovy.grails.web.context.GrailsContextLoader.createWebApplicationContext(GrailsContextLoader.java:74) 
[java]  at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 
[java]  at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 
[java]  at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530) 
[java]  at org.mortbay.jetty.servlet.Context.startContext(Context.java:135) 
[java]  at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218) 
[java]  at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500) 
[java]  at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
[java]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) 
[java]  at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117) 
[java]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) 
[java]  at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117) 
[java]  at org.mortbay.jetty.Server.doStart(Server.java:217) 
[java]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) 
[java]  at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:152) 
[java]  at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:116) 
[java]  at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:218) 
[java]  at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162) 
[java]  at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48) 
[java]  at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113) 
[java]  at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89) 
[java] Caused by: org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.orm.jpa.JpaSystemException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role"; nested exception is javax.persistence. PersistenceException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  ... 7 more 
[java] Caused by: org.springframework.orm.jpa.JpaSystemException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role"; nested exception is javax.persistence.PersistenceException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  at org.grails.jpa.JpaPluginSupport$__clinit__closure3_closure6_closure11_closure38.doCall(JpaPluginSupport.groovy:452) 
[java]  at BootStrap$_closure1.doCall(BootStrap.groovy:13) 
[java]  ... 7 more 
[java] Caused by: javax.persistence.PersistenceException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:264) 
[java]  at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:122) 
[java]  ... 9 more 
[java] Caused by: org.datanucleus.exceptions.NucleusUserException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  at org.datanucleus.store.mapped.scostore.FKSetStore.<init>(FKSetStore.java:184) 
[java]  at org.datanucleus.store.appengine.DatastoreFKSetStore.<init>(DatastoreFKSetStore.java:38) 
[java]  at org.datanucleus.store.appengine.DatastoreManager.newFKSetStore(DatastoreManager.java:353) 
[java]  at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection(MappedStoreManager.java:734) 
[java]  at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField(MappedStoreManager.java:646) 
[java]  at org.datanucleus.sco.backed.HashSet.<init>(HashSet.java:102) 
[java]  at org.datanucleus.util.ClassUtils.newInstance(ClassUtils.java:94) 
[java]  at org.datanucleus.sco.SCOUtils.newSCOInstance(SCOUtils.java:164) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.wrapSCOField(JDOStateManagerImpl.java:3040) 
[java]  at org.datanucleus.store.fieldmanager.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:92) 
[java]  at org.datanucleus.store.fieldmanager.AbstractFetchFieldManager.fetchObjectField(AbstractFetchFieldManager.java:104) 
[java]  at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1197) 
[java]  at com.vobject.grailsfuse.User.jdoReplaceField(User.groovy) 
[java]  at com.vobject.grailsfuse.User.jdoReplaceFields(User.groovy) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.loadFieldsInFetchPlan(JDOStateManagerImpl.java:1610) 
[java]  at org.datanucleus.ObjectManagerImpl.performDetachAllOnCommitPreparation(ObjectManagerImpl.java:3192) 
[java]  at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2931) 
[java]  at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:369) 
[java]  at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256) 
[java]  at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:104) 
[java]  ... 9 more 
[java] Sep 4, 2009 2:08:42 AM com.google.apphosting.utils.jetty.JettyLogger warn 
[java] WARNING: Nested in org.springframework.beans.factory.access.BootstrapException: Error executing bootstraps; nested exception is org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.orm.jpa.JpaSystemException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role"; nested exception is javax.persistence.PersistenceException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role": 
[java] Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java] org.datanucleus.exceptions.NucleusUserException: Class "com.vobject.grailsfuse.User" has collection field "roles" and this has no mapping in the table for the element class "com.vobject.grailsfuse.Role" 
[java]  at org.datanucleus.store.mapped.scostore.FKSetStore.<init>(FKSetStore.java:184) 
[java]  at org.datanucleus.store.appengine.DatastoreFKSetStore.<init>(DatastoreFKSetStore.java:38) 
[java]  at org.datanucleus.store.appengine.DatastoreManager.newFKSetStore(DatastoreManager.java:353) 
[java]  at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection(MappedStoreManager.java:734) 
[java]  at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField(MappedStoreManager.java:646) 
[java]  at org.datanucleus.sco.backed.HashSet.<init>(HashSet.java:102) 
[java]  at org.datanucleus.util.ClassUtils.newInstance(ClassUtils.java:94) 
[java]  at org.datanucleus.sco.SCOUtils.newSCOInstance(SCOUtils.java:164) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.wrapSCOField(JDOStateManagerImpl.java:3040) 
[java]  at org.datanucleus.store.fieldmanager.LoadFieldManager.internalFetchObjectField(LoadFieldManager.java:92) 
[java]  at org.datanucleus.store.fieldmanager.AbstractFetchFieldManager.fetchObjectField(AbstractFetchFieldManager.java:104) 
[java]  at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:1197) 
[java]  at com.vobject.grailsfuse.User.jdoReplaceField(User.groovy) 
[java]  at com.vobject.grailsfuse.User.jdoReplaceFields(User.groovy) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791) 
[java]  at org.datanucleus.state.JDOStateManagerImpl.loadFieldsInFetchPlan(JDOStateManagerImpl.java:1610) 
[java]  at org.datanucleus.ObjectManagerImpl.performDetachAllOnCommitPreparation(ObjectManagerImpl.java:3192) 
[java]  at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2931) 
[java]  at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:369) 
[java]  at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256) 
[java]  at org.datanucleus.jpa.EntityTransactionImpl.commit(EntityTransactionImpl.java:104) 
[java]  at org.grails.jpa.JpaPluginSupport$__clinit__closure3_closure6_closure11_closure38.doCall(JpaPluginSupport.groovy:452) 
[java]  at BootStrap$_closure1.doCall(BootStrap.groovy:13) 
[java]  at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:152) 
[java]  at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:116) 
[java]  at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:218) 
[java]  at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162) 
[java]  at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48) 
[java]  at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113) 
[java]  at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89) 

conseils S'il vous plaît. Voyez si vous avez une idée de ce qui s'est mal passé ...

Merci.

Répondre

0

On dirait que le problème est que vous n'avez pas d'utilisateur sur le rôle puisque vous devrez spécifier le mappedBy sur la collection je pense.

@OneToMany(mappedBy="user",fetch=FetchType.EAGER) 
Set<Role> roles 

Aussi, vous n'avez pas vraiment besoin de l'étoffe de table de jointure puisque vous ne travaillez pas vraiment avec des tables dans app-engine. En substance, le rôle existera sous l'entité utilisateur.

Hope that helps :)

+0

oh et n'oubliez pas d'ajouter un champ d'utilisateur à la classe de rôle –

+0

Merci pour la réponse rapide et des conseils utiles. J'essaie avec vos conseils en se référant à http://www.java2s.com/Code/Java/JPA/OneToManyMappingWithMappedByToremoveMappingTable.htm Mais je fais face à une erreur ci-dessous lors de l'accès à la page rôle/liste. Erreur Cause: org.datanucleus.exceptions.NucleusUserException: Le champ com.vobject.grailsfuse.Role.user doit pouvoir fournir une référence à son parent mais l'entité n'a pas de parent. Avez-vous essayé d'établir une instance de com.vobject.grailsfuse.Role en tant qu'enfant d'une instance de com.vobject.grailsfuse.User après la persistance de l'enfant? – limcheekin

+0

Le dernier code source situé à: http://rapidshare.com/files/275893205/one2many.zip.html – limcheekin

1

Pour la mise à jour, j'ai publié appengine-gorm plugin au référentiel plugin grails, la motivation que j'ai écrit ce plugin pour soutenir l'opération d'insertion par lots. Comme je n'arrive pas à faire la relation un-à-plusieurs en utilisant l'annotation (@OneToMany) fonctionnant dans Google App Engine après tant de tentatives, j'ai décidé de gérer la relation manuellement au lieu d'utiliser le mappage. Cependant, bien que j'essaie de sauvegarder les objets dans les nombreux aspects de la relation un-à-plusieurs, je suis confronté à un délai d'attente de requête de google app engine. Ensuite, je découvre que l'API de bas niveau de support de banque de données persiste de nombreux objets dans un appel d'API, il y a donc le né de ce plugin. J'espère que cela vous profitera ainsi qu'aux autres.

Enfin, j'ai réussi à faire fonctionner la relation un-à-plusieurs manuellement et sans le mappage. S'il vous plaît regarder l'application de démonstration en direct appelé GrailsFuse au http://grailsfuse.vobject.com/.

Je me réjouis de vos commentaires et commentaires. N'hésitez pas à me laisser un email à limcheekin at vobject dot com.

Merci.

Questions connexes