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


94

如果我使用有什么区别

@OneToMany
public Set<Rating> ratings;

或者如果我使用

@OneToMany
public List<Rating> ratings;

两者都工作正常,我知道列表和集合之间的区别,但是我不知道这对休眠(或JPA 2.0)如何处理它有什么区别。

Answers:


109

如果未指定索引列,则列表将由Hibernate当作袋处理(无特定顺序)。

处理Hibernate的一个显着区别是您无法在单个查询中获取两个不同的列表。例如,如果您有一个Person包含联系人列表和地址列表的实体,则将无法使用单个查询向人员加载其所有联系人及其所有地址。在这种情况下,解决方案是进行两个查询(避免使用笛卡尔积),或者对至少一个集合使用a Set代替a List

这往往很难,当你必须定义使用与Hibernate集equals,并hashCode在实体上和没有在实体不可变的功能键。


3
有关列表发生的详细信息,请参见stackoverflow.com/q/1995080/2495717
ben3000 '16

31

如果使用列表,则可以在getter函数中指定“ Order BY”子句。您无法通过Set做到这一点。order by子句可以包含部分EJBQL。例如

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

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


19
由于它使我对Hibernate文档感到困惑:您可以 按照文档中的说明进行@Sort设置-只需使用即可。SortedSet
2013年

但是,如果使用SortedSet,它将使用比较器进行排序,因此无法按照数据库的“ order by”将其排序。
samir105 '19

由于答案是旧的,因此我想澄清一下。目前,我们可以@OrderBy在上使用Set。在下面,Hibernate将使用OrderedSetType它将实例化一个LinkedHashSet,因此顺序被保留。另外,我建议LinkedHashSet在实体中使用-为了保持一致性。来源:discourse.hibernate.org/t/...
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.