【问题标题】:Lazy fetching of objects using FindAllBy , for the first time首次使用 FindAllBy 延迟获取对象
【发布时间】:2010-06-30 00:16:43
【问题描述】:

当我使用条件查询时,结果包含延迟初始化对象的数组列表。也就是说,该列表具有处理程序org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer 的值。

这会阻止我在其中执行任何数组操作(减号、删除等)。当我使用 GORM 方法时,我得到了实际对象类型的数组列表。如何获取条件查询中的实际对象?

  1. 代码如下。
availableTypes = Type.withCriteria() {   
    'in'("roleFrom", from) 
    'in'("roleTo", to) 
}

availableTypes(一个数组列表)有一个值,但不是实际对象,而是带有GroovyAwareJavassistLazyInitializer处理程序的值

  1. availableTypes(数组列表)的值类型为 Type
availableTypes = Type.findByRoleFrom(from)

--------- 更新 ----------
我做了进一步的故障排除,这就是我发现的。可能上面的描述可能会产生误导,但我保留了它以防万一。

  • 第一次使用findAllBy 时,我得到的是代理对象而不是实际的实例。然后,我通过 ajax 调用调用该方法,加载实际实例(与缓存加载有关吗??)。当我刷新页面时,它会再次加载代理
def typeFrom = Type.findAllByParty(partyFrom)
  • findAllBy 在同一方法中还有另一种用法,它始终返回实际实例。
def relFrom = Relation.findAllByParty(partyFrom)  
  • 比较两个类时,类 Roles 的属性“party”是 1-m 关系的一部分。喜欢
class Role {
      RoleType roleType  
      LocalDate validFrom  
      LocalDate validTo      
      static belongsTo = [party : Party ]  
    ...  
}

我知道如果我做像Party.findAll() 这样的声明,角色实例在他们访问之前将是代理。但是,当直接在类(Role)上使用 gorm 时,为什么我得到代理对象???

感谢您的帮助。

谢谢。

【问题讨论】:

  • 这里的问题是什么?关于你所经历的事情有很多陈述,但很难将其提炼成一个问题

标签: grails grails-orm


【解决方案1】:

原来是我遇到但没有尝试过的几个可能的解决方案,例如

  • 重载equals方法,使代理和域 对象使用主键而不是 hashCode 来表示相等
  • 使用连接查询来获取实际实例而不是代理
  • GrailsHibernateUtil.unwrapProxy(o)
  • HibernateProxyHelper.getClassWithoutInitializingProxy(object)

对我有用的一个解决方案是在域对象映射中指定 lazy loading to be false

这里似乎讨论了这个问题的历史:GRAILS-4614

另见:eager load

【讨论】:

  • Eager 对我有用,但不适用于 HibernateProxyHelper.getClassWithoutInitializingProxy(object)
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2018-07-08
  • 2013-06-23
相关资源
最近更新 更多