我有两个实体,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
?
答案 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提供程序可以提供更大的灵活性,但您应该始终在实际数据库中测量性能,而不是盲目地调整它。