Ленивая выборка объектов с использованием FindAllBy, впервые - PullRequest
2 голосов
/ 30 июня 2010

Когда я использую критерии запросов, результат содержит массив списков ленивых инициализированные объекты. то есть список имеет значения с обработчиком org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer. Это мешает мне делать любой массив операция (минус, удалить и т. д.) в нем. Когда я использую методы GORM, я получаю массив список актуальных типов объектов. Как может Я получаю реальные объекты по критериям запрос? Код указан ниже.

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

availableTypes (список массивов) имеет одно значение, но не фактический объект, но значение с обработчиком GroovyAwareJavassistLazyInitializer

  1. availableTypes = Type.findByRoleFrom(from)
    availableTypes (список массивов) имеет значения с типом Тип

---------- Обновление ----------
я сделал дальнейшее устранение неполадок, и это то, что я нашел. Возможно, приведенное выше описание может вводить в заблуждение, но я сохранил его на случай, если оно поможет.

  • При первом использовании findAllBy я получаю прокси-объекты, а не фактический экземпляр. Затем я вызываю метод через вызов ajax, фактический экземпляр загружается (что-либо связанное с загрузкой кэша ??). Когда я обновляю страницу, она снова загружает прокси

def typeFrom = Type.findAllByParty(partyFrom)

  • в том же методе есть другое использование findAllBy, которое всегда возвращает фактические экземпляры.

def relFrom = Relation.findAllByParty(partyFrom)

  • При сравнении двух классов атрибут 'party' класса Roles является частью 1-m отношения. как

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

Я знаю, что если я сделаю оператор наподобие Party.findAll (), экземпляры роли будут прокси, пока они не получат доступ. Но, когда я использую gorm непосредственно в классе (Role), почему я получаю прокси-объекты ???

спасибо за помощь.

спасибо.

1 Ответ

1 голос
/ 24 января 2013

Оказывается, есть пара возможных решений, с которыми я столкнулся, но не попробовал, таких как - перегрузка метода equals, так что прокси и объект домена используют первичный ключ вместо hashCode для равенства - используя соединениезапрос, чтобы вы возвращали действительные экземпляры, а не прокси-серверы - GrailsHibernateUtil.unwrapProxy (o) - HibernateProxyHelper.getClassWithoutInitializingProxy (object)

Одним из решений, которое у меня работало, было указание отложенной загрузки, чтобы быть ложным в сопоставлении объекта домена.

История этой проблемы, кажется, обсуждается здесь: GRAILS-4614

См. Также: нетерпеливая нагрузка

...