第一次使用FindAllBy延迟提取对象

时间:2010-06-30 00:16:44

标签: grails gorm

  

当我使用条件查询时,   result包含lazy的数组列表   初始化的对象。就是这个清单   具有处理程序的值   org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer。   这阻止我做任何数组   操作(减去,删除等)。   当我使用GORM方法时,我得到了数组   实际对象类型列表。怎么能   我在标准中得到了实际的对象   查询?代码如下所示。

     
      
  1. availableTypes = Type.withCriteria() {
    'in'("roleFrom", from) 'in'("roleTo", to) }
  2.         

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

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

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

  • 第一次使用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时,为什么我要获取代理对象???

感谢您的帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

原来是我遇到的几种可能的解决方案,但没试过,比如   - 重载equals方法以使代理和域    对象使用主键而不是hashCode进行相等   - 使用连接查询,以便您获得实际实例而不是代理   - GrailsHibernateUtil.unwrapProxy(o)   - HibernateProxyHelper.getClassWithoutInitializingProxy(object)

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

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

另请参阅:eager load