Answers:
如果未指定索引列,则列表将由Hibernate当作袋处理(无特定顺序)。
处理Hibernate的一个显着区别是您无法在单个查询中获取两个不同的列表。例如,如果您有一个Person
包含联系人列表和地址列表的实体,则将无法使用单个查询向人员加载其所有联系人及其所有地址。在这种情况下,解决方案是进行两个查询(避免使用笛卡尔积),或者对至少一个集合使用a Set
代替a List
。
这往往很难,当你必须定义使用与Hibernate集equals
,并hashCode
在实体上和没有在实体不可变的功能键。
如果使用列表,则可以在getter函数中指定“ Order BY”子句。您无法通过Set做到这一点。order by子句可以包含部分EJBQL。例如
@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;
如果将此字段留为空白,则会根据主键的值以升序对列表进行排序。
@OrderBy
在上使用Set
。在下面,Hibernate将使用OrderedSetType
它将实例化一个LinkedHashSet
,因此顺序被保留。另外,我建议LinkedHashSet
在实体中使用-为了保持一致性。来源:discourse.hibernate.org/t/...