【问题标题】:@OneToMany List<> vs Set<> difference@OneToMany List<> vs Set<> 区别
【发布时间】:2011-09-27 14:34:00
【问题描述】:

如果我用有什么区别

@OneToMany
public Set<Rating> ratings;

或者如果我使用

@OneToMany
public List<Rating> ratings;

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

【问题讨论】:

    标签: java jpa


    【解决方案1】:

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

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

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

    【讨论】:

    • 因为它让我争先恐后地获取我的 Hibernate 文档:您可以 @Sort 一组 - 只需按照 in the docs 的说明使用 SortedSet
    • 但是如果你使用SortedSet,它是用比较器排序的,没有办法让它按照数据库的“排序依据”排序。
    • 既然是旧答案,我想澄清一下。目前我们可以在Set 上使用@OrderBy。在下面,Hibernate 将使用OrderedSetType,它将实例化一个LinkedHashSet,所以顺序是保留的。另外,我建议在实体中使用LinkedHashSet - 为了保持一致。来源:discourse.hibernate.org/t/…
    【解决方案2】:

    如果没有指定索引列,则列表将被 Hibernate 作为一个包处理(没有特定顺序)。

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

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

    【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多