集合属性映射


Hibernate要求持久化集合值字段必须声明为接口,实际的接口可以是java.util.Set、java.util.Collection、java.util.List、java.util.Map、java.util.SortedSet、java.util.SortedMap等。也可以是自定义类型(只需实现org.hibernate.usertype.UserCollectionType接口即可)。

Hibernate之所以要求使用集合接口来声明集合属性,是因为当程序持久化某个实例时,Hibernate会自动把程序中的集合实现类替换成Hibernate自己的集合实现类,因此不要试图把Hibernate集合属性强制转换成集合实现类,如HashSet、HashMap等,但可以转换为Set、Map等集合。


集合映射元素大致有:

 list:用于映射List结合属性。

 set:用于映射Set集合属性。

 map:用于映射Map集合属性。

 array:用于映射数组集合属性。

 rimitive-array:专门用于映射基本数据类型的数组。

 bag:用于映射无序集合。

 idbag:用于映射无序集合,但为集合增加逻辑次序。


集合可选属性

 name:集合属性的名称。

 table:指定保存集合属性的表名。如果没有指定该属性,则表名默认与集合属性同名。

 schema:指定保存集合属性的数据表的Schema的名称,用于覆盖在根元素中定义的schema属性。

 lazy:设置是否启动延迟加载,该属性默认是true,即大多数操作不会初始化集合类。

 inverse:指定该集合关联的实体在双向关联关系中不控制关联关系。

 cascade:指定对持久化对象的操作(如saveupdatedelete)是否会级联到它所关联的子实体。

 order-by:该属性用于设置数据库对集合元素排序。

 sort:指定结合的排序顺序,可以为自然排序,或者使用给定的排序类排序。

 where:指定任意的SQL语句中where条件,该条件将在加载或者删除集合元素时起作用,只有满足where条件的记录才会被操作。

 batch-size:定义延迟加载时每批抓取集合元素的数量,该属性默认是1

 access:指定hibernate访问集合属性的访问策略,默认是property.

 mutable:指定结合元素是不可变得,在某些情况下可以进行一些小的性能优化。

key元素可选属性

  column:指定外键字段的列名。

on-delete:指定外键约束是否打开数据库级别的级联删除。

property-ref:指定外键引用的字段是否为原表的主键。

not-null:指定外键列是欧服具有非空约束,如果指定非空约束,则意味着无论何时,外键总是主键的一部分。

update:指定外键列是否可更新,如果不允许更新,则意味着无论何时,外键总是主键的一部分。

unique:指定外键列是否具有唯一约束,如果指定了唯一约束,则意味着无论何时,外键总是主键的一部分。

用于映射索引列的元素:

 <list-index .../>:用于映射List集合、数组的索引列。

 <map-key .../>:用于映射Map集合、基本数据类型的索引列。

 <map-key-many-to-many>:用于映射Map集合、实体引用类型的索引列

 <composite-map-key >:用于映射Map集合、复合数据类型的索引。


List集合属性

public class Person {

    private Integer id;

    private String name;

    private int age;

    private List<String> schools = new ArrayList<String> ();

    .....

}


<list name="schools" table="school">

    <!--  映射集合属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射集合属性数据表的集合索引列 -->

    <list-index column="list_order"/>

    <!-- 映射保存集合元素的数据列 -->

    <element type="string" column="school_name"/>

</list>


注:因为集合元素是String类型,所以集合元素使用<element>元素即可。person中定义List属性已经使用了泛型来限制集合元素的类型,这样Hibernate可以通过反射来取得集合元素的数据类型,因此定义<element .../>元素时无需指定type属性。但建议用<element .../>元素来映射集合元素时指定一个type属性,告诉hibernate集合元素的类型,这样就避免了hibernate自己去识别。

数组属性

public class Person {

    private Integer id;

    private String name;

    private int age;

    private String[] schools;

    .....

}


<array name="schools" table="school">

    <!--  映射数组属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射数组属性数据表的集合索引列 -->

    <list-index column="list_order"/>

    <!-- 映射保存数组元素的数据列 -->

    <element type="string" column="school_name"/>

</array>


Set集合属性

public class Person {

    private Integer id;

    private String name;

    private int age;

    private Set<String> schools = new HashSet<String>();

    .....

}


<set name="schools" table="school">

    <!--  映射集合属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射保存集合元素的数据列 -->

    <element type="string" column="school_name" not-null="true"/>

</set>


bag元素映射

<bag .../>元素既可以映射list集合元素,也可以映射Set集合属性,甚至可以映射Collection集合属性。不管是哪种集合属性,使用<bag .../>元素都将被映射成无序集合。集合属性对应的表没有主键。


public class Person {

    private Integer id;

    private String name;

    private int age;

    private Collection<String> schools = new ArrayList<String>();

    //.....

}


<bag name="schools" table="school">

    <!--  映射集合属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射保存集合元素的数据列 -->

    <element type="string" column="school_name" not-null="true"/>

</bag>

Map集合属性

public class Person {

    private Integer id;

    private String name;

    private int age;

    //考试成绩

    private Map<String,Float> scoresnew HashMap<String,Float>();

    //.....

}



<map name="scores" table="score">

    <!--  映射集合属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射集合属性数据表的Map key列 -->

    <map-key column="subject" type="string"/>

    <!-- 映射保存集合元素的数据列 -->

    <element type="string" column="school_name" not-null="true"/>

</map>


有序集合属性(SortedSet/SortedMap

Hibernate还支持使用SortedSet/SortedMap两个有序集合,当我们需要映射这种有序集合时,应该为<map .../>元素或<set .../>元素指定sort属性,该属性值可以是如下三个值。

 unsorted:映射有序集合时不排序。

 natural:映射有序集合时使用自然排序。

 java.util.Comparator实现类的类名:使用排序器对有序集合元素进行定制排序。


public class Person {

    private Integer id;

    private String name;

    private int age;

    private SortedSet<String> trainingsnew TreeSet<String>();

    //.....

}


    <!-- 映射SortedSet集合属性,使用自然排序增加sort='natual'定义 -->

<set name="trainings" table="training" sort="natural">

    <!--  映射集合属性数据表的外键列 -->

    <key column="personid" not-null="true"/>

    <!-- 映射保存集合元素的数据列 -->

    <element type="string" column="training_name" not-null="true"/>

</set>