Является ли плохой практикой использование объектов домена в наборах или в качестве ключей в Картах?
В прошлом я кое-что делал нравится это много
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)