Set
HashSet 无序,不重复
List
有序,可重复
Map
键值对
HashMap 无序,不重复(以key为准,看是否重复)
数组:有序、可重复
Bag:无序、可重复。一个大口袋,向里面扔东西。则无序,可重复。
通过映射信息,就可以构建出表的结构,而属性是集合的时候,集合本身就对应于一张表,这张表的关系和主表的关系有可能是一对一、一对多、多对多的情况。
所以在映射文件中要反映出集合表的创建情况,即通过映射文件创建出的数据库中的表。
写下面这些配置文件时,看关联的表该怎样建,那么对应的集合的配置文件就应该怎样写,从这个角度去写配置文件。
<hibernate-mapping package="cn.itcast.e_hbm_collection">
<class name="User" table="user">
<id name="id">
<generator></generator>
</id>
<property name="name"/>
<!-- addressSet属性,Set集合
name:表示的是主表对应的对象的属性
table属性:集合表的名称
key子元素:集合外键的列名
element子元素:存放集合元素的列的信息
sort属性:"unsorted|natural|comparatorClass"
默认为:unsorted
order-by属性:写的是order by 子句,是SQL语句,是操作的集合表。即在查询表的时候在sql语句中加上Order by
这是在查询数据时指定orderby子句。
-->
<set name="addressSet" table="user_addressSet" order-by="address ASC">
<!--name属性名,因为set也是User的一个属性,table指定创建的表名。address ASC说明是按Address进行Asc升序-->
<key column="userId"></key>
<!--指定外键的列名,他会自动将父表的主键,作为自己的外键,我们只需要指定外键的类名。-->
<element type="string" column="address"></element>
</set>
<!-- addressList属性,List集合
list-index:用于存放索引的列,用于标示List集合的顺序,所以多出来这么一列来。
-->
<list name="addressList" table="user_addressList">
<key column="userId"></key>
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</list>
------------------------------------------------------
<!-- addressArray属性,数组。与List的映射基本一致 -->
<array name="addressArray" table="user_addressArray">
<key column="userId"></key>
<list-index column="idx"></list-index> <element type="string" column="address"></element>
</array>
<!-- addressMap属性,Map集合 -->
<map name="addressMap" table="user_addressMap">
<key column="userId"></key>
<map-key type="string" column="key_"></map-key>
<!--是集合中的Map的key.下面的element是Map的value-->
<element type="string" column="address"></element>
</map>
<!-- addressBag属性,Bag集合:无序,可重复。与Set集合的映射基本一致 -->
<bag name="addressBag" table="user_addressBag">
<key column="userId"></key>
<element type="string" column="address"></element>
</bag>
<set name="addressSet" table="user_addressSet" order-by="address ASC">
<key column="userId"></key>
<element type="string" column="address"></element>
</set>
使用集合属性时,一定要使用接口,而不能声明为具体的实现类。
因为经过Session操作后,集合就变成了Hibernate自己的集合实现类。
这是set集合再数据库中查到数据之后再内存中的排序。它比直接在数据库中通过Order—by排序效率要低了。数据库中Order-by是数据库查询之后就是排序的结果。