集合属性映射
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-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> scores= new 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> trainings= new 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>