【发布时间】:2011-09-27 14:34:00
【问题描述】:
如果我用有什么区别
@OneToMany
public Set<Rating> ratings;
或者如果我使用
@OneToMany
public List<Rating> ratings;
两者都可以正常工作,我知道列表和集合之间的区别,但是我不知道这是否会影响 hibernate(或者更确切地说是 JPA 2.0)处理它的方式。
【问题讨论】:
如果我用有什么区别
@OneToMany
public Set<Rating> ratings;
或者如果我使用
@OneToMany
public List<Rating> ratings;
两者都可以正常工作,我知道列表和集合之间的区别,但是我不知道这是否会影响 hibernate(或者更确切地说是 JPA 2.0)处理它的方式。
【问题讨论】:
如果你使用 List,那么你可以在 getter 函数中指定一个 'Order BY' 子句。你不能用 Set 做到这一点。 order by 子句可以包含部分 EJBQL;例如
@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;
如果您将此字段留空,则列表将根据主键的值按升序排序。
【讨论】:
@Sort 一组 - 只需按照 in the docs 的说明使用 SortedSet。
Set 上使用@OrderBy。在下面,Hibernate 将使用OrderedSetType,它将实例化一个LinkedHashSet,所以顺序是保留的。另外,我建议在实体中使用LinkedHashSet - 为了保持一致。来源:discourse.hibernate.org/t/…
如果没有指定索引列,则列表将被 Hibernate 作为一个包处理(没有特定顺序)。
处理 Hibernate 的一个显着区别是您不能在单个查询中获取两个不同的列表。例如,如果您有一个具有联系人列表和地址列表的Person 实体,您将无法使用单个查询来加载人员及其所有联系人和所有地址。在这种情况下,解决方案是进行两次查询(避免笛卡尔积),或者对至少一个集合使用Set 而不是List。
当您必须在实体上定义 equals 和 hashCode 并且在实体中没有不可变的功能键时,通常很难将 Sets 与 Hibernate 一起使用。
【讨论】: