@OneToMany List<>和Set<>的区别

118

如果我使用

,有什么区别吗?
@OneToMany
public Set<Rating> ratings;

或者如果我使用

@OneToMany
public List<Rating> ratings;

两者都可以正常工作,我知道列表和集合之间的区别,但是我不知道这是否会影响Hibernate(或者更确切地说是JPA 2.0)如何处理它。

2个回答

131
如果没有指定索引列,列表将仅被Hibernate视为一个包(没有特定的排序)。
Hibernate处理方式中一个显著的差异是,您无法在单个查询中获取两个不同的列表。例如,如果您有一个名为 Person 的实体,其中包含联系人列表和地址列表,则无法使用单个查询加载所有联系人和地址的人员。在这种情况下的解决方案是执行两个查询(避免笛卡尔积),或者将至少一个集合使用Set代替List
在Hibernate中使用Set经常很困难,尤其是在必须在实体上定义equalshashCode且不存在不可变的函数键的情况下。

3
关于列表的详细内容,请参见https://dev59.com/2HI-5IYBdhLWcg3wJE0K。 - ben3000

33

如果你使用 List,那么你可以在 getter 函数中指定 'Order BY' 子句。但是如果使用 Set,则不能这样做。order by 子句可以包含部分 EJBQL;例如:

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

如果您将此字段留空,则根据主键的值按升序对列表进行排序。


22
既然它让我查找我的 Hibernate 文档:你是可以使用 @Sort 对一个集合进行排序的 - 只需按照文档中所述使用 SortedSet 即可。 - mabi
但如果你使用SortedSet,它会使用比较器进行排序,没有办法按照数据库的“order by”排序。 - samir105
6
因为这是旧答案,所以我想澄清一下。目前我们可以在Set上使用@OrderBy。在底层,Hibernate将使用OrderedSetType,它将实例化一个LinkedHashSet,因此顺序得到保留。此外,我建议在实体中使用LinkedHashSet,以保持一致性。来源:https://discourse.hibernate.org/t/does-hibernate-persistentset-maintain-order-when-using-orderby/73 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接