Разве это плохая практика - использовать объекты домена в Устанавливает или в качестве ключей в Картах?
В прошлом я много делал подобные вещи
Set<Book> someBooks = [] as Set
someBooks.addAll (Book.findAllByAuthorLike('%hofstadter%'))
someBooks.add (Book.findByTitleLike ('%eternal%'))
Однако я заметил, что часто сталкиваюсь с проблемами, когда findAllByAuthorLike
может возвращать список объектов Hibernate Proxy com.me.Book_$$_javassist_128
, но findByTitleLike
возвращает правильный com.me.Book
объект.Это вызывает дубликаты в наборе, потому что реальный объект и прокси считаются не равными.
Я считаю, что мне нужно быть предельно осторожным при использовании наборов объектов доменавот так, и у меня возникает ощущение, что это может быть то, что я не должен делать в первую очередь.
Альтернативой, конечно, является использование набора / карты идентификаторов, но это делает мой код многословным и склонным к недоразумениям
Set<Integer> someBooks = [] as Set // a set of id's for books
@ Burt: Я думал, что доменные классы Grails уже сделали это, по крайней мере, чтобы сравнение / сравнение было выполнено для классов / идентификаторов, а не для экземпляра объекта.Вы имеете в виду специальный компаратор для спящих прокси?
return (this.class == obj.class && this.id == obj.id) ||
(obj.class == someHibernateProxy && this.id == obj.id)