Hibernate Collection vs List作为字段类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate Collection vs List作为字段类型相关的知识,希望对你有一定的参考价值。
我有两个实体,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
吗?
- 设置 - 不包含任何重复的订单
- (袋)收藏 - 不复制任何订单
- 列表 - 重复订单
对于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
java.util.Collection
是最通用的无序元素集合,而java.util.List
暗示存在迭代顺序。
使用@OrderColumn
将给出此迭代顺序,但它可能会更改生成的SQL查询。通常它会导致将ORDER BY
语句添加到SQL查询中。如果没有@OrderColumn
,JPA提供程序可以提供更大的灵活性,但您应该始终在实际数据库中测量性能,而不是盲目地调整它。
以上是关于Hibernate Collection vs List作为字段类型的主要内容,如果未能解决你的问题,请参考以下文章
hibernate懒加载的问题,failed to lazily initialize a collection of role
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
映射值类型集合-002映射Bag(<idbag><collection-id>)
ssh框架错误:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role。