Grails: проверка наличия отдельного объекта в прикрепленном наборе - PullRequest
1 голос
/ 28 ноября 2010

Сеанс моего приложения содержит объекты пользователя, которые имеют объекты настроек, которые содержат атрибут «ffectiveOrganisation ».Объекты настроек загружаются с нетерпением, и, поскольку Hibernate-сессия выполняется по запросу, пользовательский объект в сеансе отсоединяется от Hibernate-Session.

Я хочу проверить, находится ли «ффективная организация »в наборе присоединенногообъект:

<g:if test="${session.user.settings.effectiveOrganisation in
    documentInstance.downloadingOrganisations}">

Но результат этого теста всегда ложен.Возможно, это связано с тем, что организация в сеансе и организация documentInstance не являются идентичными объектами.Я реализовал equals и hashCode в классе Organisation, но это не помогло.

Я попробовал следующий тест в контроллере:

    def org = session.user.settings.effectiveOrganisation
    doc.downloadingOrganisations.each{
        if(it.equals(org))
            println("equals works")
    }
    if(! doc.downloadingOrganisations.contains(org))
        println("contains doesn't work")

Удивительный результат:

equals works
contains doesn't work

equals и hashCode выглядит следующим образом:

boolean equals(o) {
    if (this.is(o)) return true;
    if (getClass() != o.class) return false;
    Organisation that = (Organisation) o;
    if (name != that.name) return false;
    if (selfInspecting != that.selfInspecting) return false;
    return true;
}

int hashCode() {
    int result;
    result = (name != null ? name.hashCode() : 0);
    result = 31 * result + (selfInspecting != null ? selfInspecting.hashCode() : 0);
    return result;
}

Как проверить, содержится ли объект из сеанса в наборе присоединенного объекта?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Похоже, что ваше вычисление хеш-кода, вероятно, является проблемой.Хеш-код, как правило, намного дешевле вычислить, чем равно, поэтому сначала сравниваем.Если происходит коллизия и два разных объекта генерируют один и тот же хэш-код, то проверяется equals ().Но если два объекта имеют разные хеш-коды, то в соответствии с контрактом hashcode / equals они считаются разными объектами.

Экземпляры в коллекции являются прокси - влияет ли это на вычисление хэш-кода?

0 голосов
/ 29 ноября 2010

Проверьте класс экземпляров. Хеш-код, вероятно, не является проблемой, но объекты, скорее всего, являются прокси Hibernate, что является проблемой.

Проверьте, вызывается ли equals () во время функции contains ()

Кроме того, изменив это g: если на

g:if test="${session.user.settings.id in
      documentInstance.downloadingOrganisations*.id}"

Может это исправить.

...