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.
oh et n'oubliez pas d'ajouter un champ d'utilisateur à la classe de rôle –
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
Le dernier code source situé à: http://rapidshare.com/files/275893205/one2many.zip.html – limcheekin