セットでドメインオブジェクトを使用するのは悪い習慣ですか、それともマップでキーとして使用するのは悪い習慣ですか?
過去に私はこのようなことをたくさんしました
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
ます。これにより、実際のオブジェクトとプロキシが等しくないと見なされるため、セット内で重複が発生します。
このようなドメインオブジェクトのセットを使用するときは、細心の注意を払う必要があると思います。そもそも、それは私がすべきではないことかもしれないと感じています。
もちろん、別の方法はIDのセット/マップを使用することですが、コードが冗長になり、誤解されやすくなります。
Set<Integer> someBooks = [] as Set // a set of id's for books
@Burt:少なくともオブジェクトインスタンスではなくclass /idでequals/compareが実行されるように、Grailsドメインクラスはすでにこれを実行していると思いました。休止状態のプロキシ用の特別なコンパレータを意味しますか?
return (this.class == obj.class && this.id == obj.id) ||
(obj.class == someHibernateProxy && this.id == obj.id)