【问题标题】:Hibernate Collection vs List as field typeHibernate Collection vs List 作为字段类型
【发布时间】:2018-08-13 03:35:09
【问题描述】:

我有两个实体,Author 和 Book,通过一对多关系连接。将字段类型指定为Collection<Book> 和List<Book> 有什么区别?上述场景如下:

@Entity
public class Author {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author")
    private Collection<Book> books = new ArrayList<>(); // List<Book> instead?
}

我已经注意到的唯一区别是,当我想使用@OrderColumn 注释时,我需要使用List,但是还有其他我不知道的区别吗?如果我不需要订单,我是否应该始终使用Collection?

【问题讨论】:

  • 是的,您可以用于无序收集。 @OrderColumn 用于像列表这样的有序集合。

标签: java hibernate orm one-to-many


【解决方案1】:
  • 设置 - 不包含重复项没有顺序
  • (Bag)Collection - 无订单重复
  • 列表 - 重复订单

对于 Set,您需要注意 hashcode 和 equals。与生成的 SQL 有关的 Bags 的一个有趣转折:

如果我们在 hibernate 中使用 List 作为映射属性而不 索引列,hibernate 将其视为一个 Bag。由于 Hibernate 处理 List as a Bag(具有非唯一值的无序集合。最好的 一个包的特点是你可以得到一个出现的次数 对象通过 API 与列表,没有办法做同样的事情 无需遍历整个列表。)一旦我们删除并 在此集合中添加一个元素。 Hibernate 发出一条 SQL 删除所有 连接表中不应该删除的元素 然后将它们全部从包中重新插入。

http://lkumarjain.blogspot.no/2013/07/why-hibernate-does-delete-all-entries.html

【讨论】:

  • 所以如果我理解正确我不应该使用没有@OrderColumn注解的List类型,对吧?
  • 如果您使用联接表,是的。如果你使用没有可连接的 JoinColumn,如果关系是双向的,我忘了说这种行为不会发生。永远不要使用单向 OneToMany
  • 不要在没有 JoinTable 的情况下使用单向 OneToMany。
【解决方案2】:

java.util.Collection 是最通用的无序元素集合,而java.util.List 意味着存在迭代顺序。

使用@OrderColumn 将给出此迭代顺序,但它可能会更改生成的 SQL 查询。通常它会导致将ORDER BY 语句添加到 SQL 查询中。如果没有@OrderColumn,JPA 提供者会有更大的灵活性,但您应该始终在实际数据库中衡量性能,而不是盲目地对其进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2021-09-26
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多