为什么hibernate返回persistantBag而不是list?

时间:2012-10-03 22:18:15

标签: hibernate

我在SchoolStudent实体之间有一对多的映射。

public class School{
   @oneToMany
   private List<Student> students;
 ...
}

默认情况下,Hibernate会懒惰地抓住学生,但是我不清楚为什么它加载自己的List(PersistantBag)实现而不是java ArrayList?

1 个答案:

答案 0 :(得分:0)

列表是有序集合。另一方面,PersistantBag(根据Hibernate API)是:

  

无序,无键的集合,可以多次包含相同的元素。奇怪的是,Java集合API没有Bag。大多数开发人员似乎都使用Lists来表示包语义,因此Hibernate遵循这种做法。

换句话说,行李只是列表中项目的随机集合。

为了让Hibernate将List视为有序集合,它需要一个索引列(参见Indexed Collections)。但是由于你没有这样的列,Hibernate使用“bag语义”。最后开发人员对您没有太大的区别,因为您可能不依赖于订单,但如果确实需要,您可以添加索引列以获取这些功能。

包的另一个不错的功能是,您可以获得集合中对象的occurrences个数,而在List中,您需要遍历整个列表才能找到它。

其他资源:

Why Hibernate does "delete all then re-insert" - its not so strange