说明:在前面我们已经使用过set 集合类型,其实除了set 外, 在Hibernate 中还有list 、Bag 、Map 这三种集合类型。
<!-- [if !supportLists]-->1. <!-- [endif]-->list 集合的使用:
在前面的“一对多的关系”,已经使用过<set> ,为了保存以前的操作,现重建一个名为“TheCollectionMapping ”的新项目,把以前的“一对多关系”中用到的相关内容复制到此项目下即可。 但有几点需要特别注意:(1 )同样注意导入包,并注意主配置文件对实体配置文件的关联 (2 )需要修改原Department 中的<set> 内容为:private List<Employee> emps ; 并修改原实体配置文件<set> 配置内容为<list> 内容如下:
< list name = "emps" >
< key column = "depart_id" />
< list-index column = "order_by" />
< one-to-many class = "Employee" />
</ list >
(3 )并注意测试类中相应的修改 (4 )强调说明的是list 查询时,具有顺序性,可以查看此项目下测试类的说明。(5 )再次强调,为了充分理解一些问题,我们可以查看执行后表结构,也可以注释掉一些内容查看异常情况,并学会解决异常。注意配置文件中相关配置的作用,并尝试探索底层实现。
2.bag 集合的使用:
如果在实体类中使用了List 类型的属性,而我们并不希望保证集合顺序(保证集合顺序会采用排序算法,因而会占一些CPU 资源)可以在配置文件中使用<bag>, 它的使用情况与<list> 唯一不同的就是不保证集合顺序。
3.map 集合的使用:
一般是和实体类中java.util.Map 属性进行配合使用,而且使用情况较少。除非某些特殊要求。 总结使用规则:大部分情况下使用<set> ;需要保证集合顺序时使用<list> ;想用java.util.List 而不想保证顺序时,使用〈bag 〉;<map> 作为特殊使用。配置也基本一样,只是在<map> 元素下多了<map-key>
4. 使用集合中的注意事项:
(1 )在实体类中集合只能被定义成接口而不能定义成具体类,因为集合会在运行时被替换成Hibernate 的实现,而事实上把实体类的属性定义成接口也更便于扩展及良好的维护。这里不防提出一个原则,“尽量用接口定义”。(2 )Hibernate 操作List 持久对象时,会用 org.hibernate.collection.PersistentList 重新实现List 接口,操作完成后会把这个实现类重新setXXX 放置。具体请参见TheCollectionMapping 项目下的 OneToManyTest 类说明。其它的集合对象也是一样的道理。