Hibernate Collection vs List作为字段类型

时间:2018-03-05 13:04:38

标签: java hibernate orm one-to-many

我有两个实体,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

2 个答案:

答案 0 :(得分:1)

  • 设置 - 不包含任何重复订单
  • (行李)收藏 - 不重复订单
  • 列表 - 重复订单

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

  

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

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

答案 1 :(得分:0)

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

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