集合属性映射
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:指定对持久化对象的操作(如save、update、delete)是否会级联到它所关联的子实体。
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集合属性
public class Person {
private Integer id;
private String name;
private int age;
private List
.....
}
<list name="schools" table="school">
<key column="personid" not-null="true"/>
<list-index column="list_order"/>
<element type="string" column="school_name"/>
list>
注:因为集合元素是String类型,所以集合元素使用
数组属性
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
.....
}
<set name="schools" table="school">
<key column="personid" not-null="true"/>
<element type="string" column="school_name" not-null="true"/>
set>
bag元素映射
public class Person {
private Integer id;
private String name;
private int age;
private Collection
//.....
}
<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
//.....
}
<map name="scores" table="score">
<key column="personid" not-null="true"/>
<map-key column="subject" type="string"/>
<element type="string" column="school_name" not-null="true"/>
map>
有序集合属性(SortedSet/SortedMap)
Hibernate还支持使用SortedSet/SortedMap两个有序集合,当我们需要映射这种有序集合时,应该为元素或
unsorted:映射有序集合时不排序。
natural:映射有序集合时使用自然排序。
java.util.Comparator实现类的类名:使用排序器对有序集合元素进行定制排序。
public class Person {
private Integer id;
private String name;
private int age;
private SortedSet
//.....
}
<set name="trainings" table="training" sort="natural">
<key column="personid" not-null="true"/>
<element type="string" column="training_name" not-null="true"/>
set>