Hibernate Collection vs List作为字段类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate Collection vs List作为字段类型相关的知识,希望对你有一定的参考价值。

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

答案
  • 设置 - 不包含任何重复的订单
  • (袋)收藏 - 不复制任何订单
  • 列表 - 重复订单

对于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。

JDBC vs Hibernate(转)

sql XML Schema Collection,SQL Server中的Type vs Untyped XML