Классы домена Grails в наборах

Является ли плохой практикой использование объектов домена в наборах или в качестве ключей в Картах?

В прошлом я кое-что делал нравится это много

Set<Book> someBooks = [] as Set
someBooks.addAll (Book.findAllByAuthorLike('%hofstadter%'))
someBooks.add (Book.findByTitleLike ('%eternal%'))

Однако я заметил, что часто сталкиваюсь с проблемами, когда findAllByAuthorLike может вернуть список объектов прокси Hibernate com.me.Book _ $$ _ javassist_128 , но findByTitleLike вернет правильный объект com.me.Book . Это вызывает дубликатов в наборе, поскольку реальный объект и прокси считаются не равными .

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

Альтернативой является, конечно, набор / карта идентификаторов, но это делает мой код многословным и предрасположенным к непониманию

Set<Integer> someBooks = [] as Set // a set of id's for books    

@Burt: Я думал, что классы домена Grails уже сделали это, по крайней мере, так t шляпа equals / compare была сделана для класса / идентификатора, а не для экземпляра объекта. Вы имеете в виду специальный компаратор для прокси спящего режима?

return (this.class == obj.class && this.id == obj.id) || 
       (obj.class  == someHibernateProxy && this.id == obj.id)
7
задан Akusete 7 July 2011 в 01:01
поделиться