为什么gorm/hibernate急于加载?获得;没有具有给定标识符的行…”;

为什么gorm/hibernate急于加载?获得;没有具有给定标识符的行…”;,hibernate,grails,lazy-loading,gorm,Hibernate,Grails,Lazy Loading,Gorm,编辑:问题已通过注释解决 Grails中的域类有这样的标准代码: class Foo {...} class Bar { Foo foo } 在没有任何配置的情况下,我的理解是,在加载Bar的对象时,Foo是延迟加载的。意味着如果我这样做: def barList = Bar.all 所有bar对象的Foo都不会加载,而且如果数据库中不再存在Foo对象,bar.all不会因为延迟加载而失败,而是在尝试读取丢失的对象时失败 但是,在我们的设置中,Foo是另一个数据库的一部分,条目可能

编辑:问题已通过注释解决

Grails中的域类有这样的标准代码:

class Foo {...}

class Bar { 
   Foo foo
}
在没有任何配置的情况下,我的理解是,在加载Bar的对象时,Foo是延迟加载的。意味着如果我这样做:

def barList = Bar.all
所有bar对象的Foo都不会加载,而且如果数据库中不再存在Foo对象,bar.all不会因为延迟加载而失败,而是在尝试读取丢失的对象时失败

但是,在我们的设置中,Foo是另一个数据库的一部分,条目可能会被删除。因此,对于Foo关系,在Bar中没有外键。如果发生这种情况,则应忽略此类条形图对象。因此,我的方法仅仅是:

def barList = Bar.all
barList.each {
   try {
       // do something a.o. with the foo relation
   }
   catch (ObjectNotFoundException e) {
      // place some warnings in the log, but continue with next
   }
} 
遗憾的是,Bar.all已经失败,ObjectNotFoundException意味着GORM/Hibernate已经加入到Foo表中


但是为什么呢?

您可以使用
ignoreNotFound
告诉grails不要抛出异常是的,这有助于避免异常处理。我还发现异常发生在另一个关系上,在该关系中,已显式配置了急切加载。遗憾的是,GORM在发生错误时没有显示SQL。(当然,SQL.DEBUG是true除外)