集合属性映射

集合属性映射

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>

时间: 2024-11-11 05:27:38

集合属性映射的相关文章

(转)Hibernate框架基础——映射集合属性

http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合属性. Map结构的集合属性,每个属性值都有对应的Key映射. 集合映射的元素大致有如下几种: list:用于映射List集合属性. set:用于映射Set集合属性. map:用于映射Map集合性. array:用于映射数组集合属性. bag:用于映射无序集合. idbag:用于映射无序集合,但为集

Hibernate持久化类属性映射

Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hibernate将类型对象与数据库表建立映射关系,把类的属性映射称为数据库表的字段,Hibernate属性映射可分为简单属性映射.集合属性 映射.复合属性映射及派生属性映射.下面分别以实例介绍这几个映射及其对应的映射文件表示方式. 1.简单属性 假设有个User类,对应数据库中的User表 User类

6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)

单向多对一的关联关系 具体体现:n的一方有1的引用,1的一方没有n的集合属性 举个例子:订单Order和顾客Customer是一个单向多对一的关联关系.Order是n的一方,有对Customer的引用:而Customer作为1的一方却没有Order的集合属性. 主要是对n的一方使用@ManyToOne和@JoinColumn注解.而1的一方不需要做任何修改.具体的映射方法: 1.采用@ManyToOne注解映射多对一的关联关系,默认情况下采用“左外连接”的方式进行加载.可以通过配置@ManyTo

hibernate映射集合属性

注意:持久化集合字段必须声明为接口,两个持久化对象不能共享同一个集合元素的引用. 映射集合属性 @ElementCollection{ fetch targetClass } 映射集合属性表 @CollectionTable{ name catalog schema indexes joinColumns uniqueConstraints } @JoinColumn{ columnDefinition name insertable updatable nullable table uniqu

浅谈Hibernate中映射集合属性以及主键和外键

首先说明一下什么叫主键以及外键. 主键和外键是对于数据库来说的,数据库的表才有主键外键的说法. 主键:主键是指标识某个表中唯一且非空的一条记录行的列,这个列中的值不允许有重复的值,用于确定一个表中的一条记录,实际上主键就是告诉别人:这个数据列是唯一的. 外键:引用另外一个表中的主键,在当前表中不一定为唯一的,但是在被引用表中一般唯一.对于关系型数据库来说(比如MySQL)外键是联系数据表之间的唯一方式,主要目的是控制存储在外键表中的数据. 建立外键的前提:本表的列必须与外键类型相同(外键必须是外

1-6 hibernate映射集合属性

1.集合类框架 以Tree开头都是按顺序,默认情况下是升序排列. 以Linked 开头的都是按插入顺序排列的. 2.在hibernate中要持久化集合属性时必须将其声明为接口,如 private Set parts=new HashSet(); set元素 3.集合类接口及其常用的实现类: 4.map元素的映射 5.集合外键

7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

单向一对多的关联关系 关联特点:1的一方有n的一方的集合属性,n的一方却没有1的一方的引用 比如:Customer对Order是一对多的关联关系,则Customer中有Order的集合属性,而Order中却没有对Customer的引用.这样可以通过客户检索到其所有的订单信息,却不能够由订单得到其所属的客户. 映射单向一对多的关联关系有两个要点: 1.利用@OneToMany注解进行单向一对多的映射: 2.利用@JoinColumn来映射外键列的名称: 注意的点: 1.@OneToMany的默认检

Hibernate的执行流程和集合的映射关系

Hibernate的执行流程 集合映射 准被hibernate的运行环境 配置hibernate.cfg.xml主配置文件 1.Set集合 写User.java类 package com.gqx.collection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * javaBean的设计 *

hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇

今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList.java实体类,其他的属性不变,只是将hobby属性由Set集合类型变为List集合类型,还是把代码贴出来吧,希望不要嫌烦 package com.joe.entity; import java.util.List; public class StudentList { private int i