Hibernate Collection vs List作为字段类型

问题描述 投票:0回答:2

我有两个实体,AuthorBook,与一对多的关系相连。指定字段类型为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吗?

java hibernate orm one-to-many
2个回答
1
投票
  • 设置 - 不包含任何重复的订单
  • (袋)收藏 - 不复制任何订单
  • 列表 - 重复订单

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

如果我们在没有索引列的情况下使用List作为hibernate中的映射属性,则hibernates将其视为Bag。由于Hibernate将List作为Bag处理(具有非唯一值的无序集合。一个包的最佳特性是你可以通过API获得一个对象的出现次数有一个列表,没有迭代就没有办法做同样的事情通过整个列表。)我们删除并添加此集合中的元素。 Hibernate发出一个SQL,首先从连接表中删除所有不应删除的元素,然后从Bag中重新插入所有元素。

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.