gpt4 book ai didi

集合中的 Grails 域类

转载 作者:行者123 更新时间:2023-12-01 22:59:52 25 4
gpt4 key购买 nike

集合中使用域对象或作为 map 中的键是一种不好的做法吗?

以前我做过很多这样的事情

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

但是我注意到,当findAllByAuthorLike可能返回Hibernate代理对象列表com.me.Book_$$_javassist_128findByTitleLike<时,我经常遇到问题 将返回一个正确的 com.me.Book 对象。这会导致集合中出现重复,因为真实对象和代理被认为相等。

我发现在使用这样的域对象集时需要非常小心,而且我感觉这可能是我一开始就不应该做的事情。

另一种选择当然是使用 id 的集合/映射,但这会使我的代码变得冗长并且容易产生误解

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

@Burt:我认为 Grails 域类已经做到了这一点,至少这样 equals/compare 是在 class/id 而不是对象实例上完成的。您是指休眠代理的特殊比较器吗?

return (this.class == obj.class && this.id == obj.id) || 
(obj.class == someHibernateProxy && this.id == obj.id)

最佳答案

这根本不是坏习惯,但就像在非 Grails 应用程序中一样,如果您要将它们放入基于哈希的情况下,您应该覆盖 equalshashCode集合(HashSetHashMap 等),并且还实现 Comparable(这意味着 compareTo 方法),如果您将使用 TreeSet/TreeMap/etc.

关于集合中的 Grails 域类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com