为什么gorm/hibernate急于加载?获得;没有具有给定标识符的行…”;
编辑:问题已通过注释解决 Grails中的域类有这样的标准代码:为什么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是另一个数据库的一部分,条目可能
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除外)