为什么在我的Grails域中引入字段会破坏很多关系

为什么在我的Grails域中引入字段会破坏很多关系,grails,gorm,Grails,Gorm,我遇到了一个灰色细胞的难题,我真的很难理解,希望答案就在这里 我有一个Grails域模型,它涉及子类化、关联、子类关联,直到现在一切都很正常 我的域名与此类似 class AssocationRecord static belongsTo = [MasterRecord] class AssocationRecordB extends AssocationRecord // other fields class MasterRecord hasMany association

我遇到了一个灰色细胞的难题,我真的很难理解,希望答案就在这里

我有一个Grails域模型,它涉及子类化、关联、子类关联,直到现在一切都很正常

我的域名与此类似

class AssocationRecord
  static belongsTo = [MasterRecord]

class AssocationRecordB extends AssocationRecord
    // other fields

class MasterRecord
  hasMany associations:AssocationRecord

class MasterRecordB extends MasterRecord
  hasMany associations:AssocationRecordB
这个模型工作得很好,我可以有子类设计的主记录的特殊版本,一切都很好,直到。。。直到我想在MasterRecord中引入一个AssociationRecord,使域成为:

class MasterRecord
  AssocationRecord favouriteAssociation

  hasMany associations:AssocationRecord
有了这个介绍,一旦字段有了值,我就可以破解代码,只需尝试在MasterRecordB实例中访问集合

例如:MasterRecordB.first().associations.each(){}

这将引发MissingMethodException异常(如下所示)

我看到了对javaassist的引用,这可能是一个关于出错原因的线索吗

如果我删除新字段,一切都会恢复到预期的工作状态。我正在考虑为字段而不是对象存储一个ID,但这无助于理解为什么我会看到这种行为

谢谢

groovy.lang.MissingMethodException: No signature of method: Script1$_run_closure1.doCall() is applicable for argument types: (mypackage.AssociationRecord_$$_javassist_109) values: [mypackage.AssociationRecordB : 22777]
Possible solutions: doCall(mypackage.AssociationRecordB), call(), call([Ljava.lang.Object;), call(java.lang.Object), call(mypackage.AssociationRecordB), findAll()
  at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
  at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:273)
  at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
  at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
  at Script1.run(Script1.groovy:4)
  at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
  at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
  at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
  at groovy.lang.GroovyShell$evaluate.call(Unknown Source)
  at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
  at org.grails.plugins.console.ConsoleService.eval(ConsoleService.groovy:37)
  at org.grails.plugins.console.ConsoleService$eval.call(Unknown Source)
  at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
  at org.grails.plugins.console.ConsoleController.execute(ConsoleController.groovy:36)
  at org.grails.plugins.console.ConsoleController.execute(ConsoleController.groovy)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:601)
  at org.springsource.loaded.ri.OriginalClassInvoker.invoke(OriginalClassInvoker.java:47)
  ...