@OneToMany List <> vs Set <>差异

M4k*_*4ks 87 java jpa

如果我使用,有什么不同

@OneToMany
public Set<Rating> ratings;
Run Code Online (Sandbox Code Playgroud)

或者如果我使用

@OneToMany
public List<Rating> ratings;
Run Code Online (Sandbox Code Playgroud)

两者都工作正常,我知道列表和集合之间的区别,但我不知道这有什么不同,如何hibernate(或更确切地说JPA 2.0)处理它.

JB *_*zet 104

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

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

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

  • 有关列表的详细信息,请参阅http://stackoverflow.com/q/1995080/2495717. (3认同)

Bas*_*Roy 29

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

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;
Run Code Online (Sandbox Code Playgroud)

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

  • 因为它让我加入了我的Hibernate文档:你可以*`@ Sort`一套 - 只需使用`SortedSet`,如[文档]中所述(http://docs.jboss.org/hibernate/orm/4.2/手动/ EN-US/html_single /#集合排序). (19认同)
  • 由于这是旧答案,我想澄清一下。目前我们可以在“Set”上使用“@OrderBy”。在下面,Hibernate 将使用 `OrderedSetType` 来实例化一个 `LinkedHashSet`,因此顺序被保留。另外,为了一致性,我建议在实体中使用“LinkedHashSet”。资料来源:https://discourse.hibernate.org/t/does-hibernate-persistentset-maintain-order-when-using-orderby/73 (3认同)