簡體   English   中英

如何在GAE上為grails應用程序設置一對多單向映射?

[英]How to setup one-to-many unidirectional mapping for grails application on GAE?

我嘗試使用JPA在Google App Engine(GAE)上的grails應用程序的一對多單向映射上執行測試。 我嘗試定義的一對多單向映射是在User和Role類之間。 不幸的是,我被困住了。 奇怪的是,有沒有開發人員能夠使其成功工作。

以下是我的開發環境:

  • Windows XP專業版
  • App Engine SDK 1.2.2
  • Grails 1.1.1
  • 使用的插件:app引擎0.8.3,gorm-jpa 0.5

源代碼位於:

完整的錯誤堆棧跟蹤在這里:

 [java] Sep 4, 2009 2:08:42 AM com.google.apphosting.utils.jetty.JettyLogger warn
 [java] WARNING: Failed startup of context com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@1ebd75b{/,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)

請指教。 看看您對出什么問題有任何想法...

謝謝。

對於更新,我將appengine-gorm插件發布到grails插件存儲庫,這是我編寫該插件以支持批量插入操作的動機。 經過多次嘗試后,由於無法使用在Google App Engine中運行的注釋(@OneToMany)建立一對多關系,因此我決定手動管理該關系,而不使用映射。 但是,當我嘗試在一對多關系的許多方面保存對象時,我面臨着Google App Engine請求超時的問題。 然后,我發現數據存儲支持的低級API在一個API調用中保留了許多對象,因此該插件誕生了。 希望對您和其他人有益。

最后,我設法使一對多關系手動工作並且沒有映射。 請在http://grailsfuse.vobject.com/上觀看名為GrailsFuse的實時演示應用程序。

我歡迎您的反饋和意見。 請隨時通過limcheekin vobject dot com給我發送電子郵件。

謝謝。

看起來問題在於您在角色上沒有用戶,因為您需要在我認為的集合上指定maptedBy。

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

另外,由於您並不是真正在應用程序引擎中使用表,因此您實際上並不需要連接表的內容。 本質上,該角色將存在於用戶實體下。

希望有幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM