2010-06-30 73 views
2

當我使用條件查詢時, 結果包含懶惰 初始化對象的數組列表。也就是說,列表 具有處理器 org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer的值。 這可以防止我做任何數組 操作(減號,刪除等)。 當我使用GORM方法時,我得到了實際對象類型列表 。 我怎麼能得到標準 查詢中的實際對象?代碼如下所示。懶惰地使用FindAllBy獲取對象

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

availableTypes(一個數組列表)具有 一個值,而不是實際的對象但 值與 GroovyAwareJavassistLazyInitializer

一個處理程序
  • availableTypes = Type.findByRoleFrom(from)
    availableTypes(數組列表)具有 值類型
  • ---------- ----------更新
    我做進一步的故障排除,這是我發現了什麼。上面的描述可能是誤導性的,但我保留它以防萬一。

    • 當第一次使用findAllBy時,我得到代理對象而不是實際的實例。然後,我通過ajax調用來調用方法,實際的實例被加載(任何與緩存加載有關的事情)。當我刷新頁面,它再次加載代理

    def typeFrom = Type.findAllByParty(partyFrom)

    • 有相同的方法,它總是返回實際情況另一種使用findAllBy的。

    def relFrom = Relation.findAllByParty(partyFrom)

    • 當比較的兩個類,類角色的屬性「方」是一個1米的關係的一部分。像

    class Role { RoleType roleType
    LocalDate validFrom
    LocalDate validTo
    static belongsTo = [party : Party ]
    ...
    }

    我知道,如果我不喜歡Party.findAll聲明(),角色實例將代理直到他們訪問。但是,當直接在類(角色)上使用gorm時,爲什麼我得到代理對象?

    感謝您的幫助。

    謝謝。

    +0

    有什麼問題嗎?有很多關於你正在經歷的事情的陳述,但很難將它提煉成一個問題 – 2010-09-05 22:18:34

    +0

    我面臨同樣的情況,數組操作失敗。如何避免獲取代理對象以查找結果? – msanjay 2013-01-24 11:41:00

    回答

    1

    原來是一對夫婦,我碰到,但沒有嘗試可能的解決方案,如 - 重載equals方法,使代理和域 對象使用一個主鍵代替的hashCode平等 - 使用使您獲得實際的情況下回來,而不是代理服務器連接查詢 - GrailsHibernateUtil.unwrapProxy(O) - HibernateProxyHelper.getClassWithoutInitializingProxy(對象)爲我工作

    一種解決方案是在領域對象映射到指定lazy loading to be false 。這個問題的

    歷史似乎在這裏討論:GRAILS-4614

    參見:eager load

    +0

    渴望爲我工作,但不是HibernateProxyHelper.getClassWithoutInitializingProxy(object) – GSAN 2016-07-05 12:54:48