在Sets中使用域对象或作为 Maps 中的键是一种不好的做法吗?
过去我做过很多这样的事情
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
对象时,我经常遇到问题。这会导致集合中的重复,因为真实对象和代理被认为不相等。
我发现在使用像这样的域对象集时需要非常小心,而且我觉得这可能是我一开始不应该做的事情。
另一种方法当然是使用 id 的集合/映射,但这会使我的代码冗长且容易产生误解
Set<Integer> someBooks = [] as Set // a set of id's for books
@Burt:我认为Grails 域类已经做到了这一点,至少这样等于/比较是在类/id 而不是对象实例上完成的。你的意思是休眠代理的特殊比较器吗?
return (this.class == obj.class && this.id == obj.id) ||
(obj.class == someHibernateProxy && this.id == obj.id)