@OneToMany List<> vs Set<>区别

时间:2011-07-03 11:45:19

标签: java jpa

如果我使用

有什么不同
@OneToMany
public Set<Rating> ratings;

或者如果我使用

@OneToMany
public List<Rating> ratings;

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

2 个答案:

答案 0 :(得分:100)

如果没有指定索引列,则列表将由Hibernate作为包处理(无特定排序)。

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

当你必须在实体上定义equalshashCode并且在实体中没有不可变的功能键时,通常很难使用带有Hibernate的Sets。

答案 1 :(得分:29)

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

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

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