映射一对多关联关系
在关系数据库中,只存在
外键参照关系,而且总是由"
many"方参照"one"方,因为这样才能消除数据冗余,
因此关系数据库实际上只支持多对一或一对一的单向关联。
在配置文件中"多的"一方对应"一的"一方,属性不可以用<property>来配置
e.g.<many-to-one
name="customer"
column="CUSTOMER_ID"
class="com.shaogq.relational.one2more.Customer"
not-null="true"
lazy="false"
cascade="save-update"
/>
说明:
<many-to-one>元素建立了customer属性和ORDERS的外键CUSTOMER_ID直接的映射。它包含以下属性:
name:设定待映射的持久化类的属性的名字,此处为Order类的customer属性。
column:设定和持久化类的属性对应的表的外键,此处为ORDERS表的外键CUSTOMER_ID。
class:设定待映射的持久化类的属性的类型,此处设定customer属性为Customer类型。
not-null:该属性的默认值为false,如果为true,表示customer属性不允许为null。not-null属性会影响hbm2ddl工具生成的数据
库
Schema。hbm2ddl工具会为ORDERS表的CUSTOMER_ID外键设置not null约束,但not-null属性不会影响hbm2java工具
生成Java源代码。此外,not-null属性还会影响Hibernate的运行时行为,Hibernate在向数据库中保持Order对象时,会
先检查它的customer属性是否为null。
lazy:如果为proxy,表示对关联的Customer对象使用延迟检索策略并且使用代理,这是默认值。
如果为false,就意味着当Hibernate从数据库中加载Order时,还会立即自动加载与它关联的Customer对象。
cascade:如果为save-update,表名保存或更新当前对象(insert/update)时,会级联保存或更新与它关联的对象。默认值为none。
映射一对多双向关联关系
Hibernate要求在持久化类中定义
集合类属性时,必须把属性声明为
接口类型,如java.util.Set,java.util.Map和java.util.List。
声明为接口可以提高持久化类的透明性,当Hibernate调用setOrders(Set orders)方法时,传递的参数是Hibernate
自定义的实现类实例。
private Set orders = new HashSet();提高代码健壮性,避免NullPointerException
参数
配置方法:
<set name="orders"
cascade="save-update"
inverse="true">
<key column="CUSTOMER_ID"/>
<one-to-many class="com.shaogq.relational.one2more.Order"/>
</set>
<set>元素包括以下属性:
name:设定待映射的持久化类的属性名,这里为Customer类的orders属性。
cascade:当取值为"save-update",表示级联保存和更新,
当取值为"delete"时表示级联删除,
当取值"all"代表两个都有,
当取值"all-delete-orphan"时,表示关联双方存在父子关系,由父方控制子方的声明周期,子方不允许单独存在。
默认值为"none"。当需要删除父方并删除与子类关系时使用,这时inverse="false"
inverse:对立,即是否维护关系,默认为false。则“一的”一方维护关系。双向一对多应该又多的一方维护关系,则应该设置为inverse="true"
子元素<key>:设定与所关联的持久化类对应的表的外键,此处为ORDERS表的CUSTOMER_ID字段
子元素<one-to-many>:设定所关联的持久化类,此处为Order类。
映射一对多双向自身关联关系
映射一对多双向自身关联关系时,仍应该有多的一方维护关系及<set>中inverse="true",
为了保证会维护关系,所以要将多的一方中的父节点赋值。
同时为了保持只需要保存根节点全部都保存,也需要将子节点保存进去(在级联的时候才会保存)。
所以只有一种配置方式
<class name="com.shaogq.relational.one2more2myself.Category" table="CATEGORY">
<id name="id" column="ID" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="NAME" type="java.lang.String"/>
<many-to-one
name="parentCategory"
column="CATEGORY_ID"
class="com.shaogq.relational.one2more2myself.Category"
not-null="false"
cascade="save-update"
/>
<set name="childCategories"
cascade="save-update"
inverse="true"
>
<key column="CATEGORY_ID"/>
<one-to-many class="com.shaogq.relational.one2more2myself.Category"/>
</set>
</class>
cascade属性说明:
cascade属性值 描述
none 当通过Session操纵当前对象时,忽略其他关联对象。它是cascade属性的默认值。
save-update 当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的 新建的临时对象,并且级联更新所有关联的游离对象。
persist 当通过Session的persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。
merge 当通过Session的merge()方法来
融合当前对象是,会级联融合所有关联的游离对象。
delete 当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
lock 当通过Session的lock()方法把当前游离对象加入到Session
缓存中时,会把所有关联的游离对象也加入到Session缓存中。
replicate 当通过Session的replicate()方法复制当前对象时,会级联复制所有关联的对象。
evict 当通过Session的evice()方法从Session缓存中清除当前对象时,会级联清除所有关联的对象。
refresh 当通过Session的refresh()方法刷新当前对象时,会吉林刷新所有关联的对象。所谓的刷新是指读取数据库中相应数据,
然后根据数据库中的最新数据去
同步更新Session缓存中的相应对象。
all 包含save-update,persist,merge,delete,locak,replicate,evict及refresh的行为。
delete-orphan 删除所有和当前对象接触关联关系的对象。
all-delete-orphan 包含all和delete-orphan的行为。