Hibernate的关联关系:
1、一对一
2、一对多|多对一
在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多关系需要在关联的双方进行映射配置。
下面以客户(Customer)与订单(Order)为例:
2.1、单向关联
Customer类的映射文件(Customer.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.domain" > <class name="Customer" table="t_customer" > <id name="id" > <generator class="native"></generator> </id> <property name="name" ></property> <!-- set元素: 将实体中的集合属性注册 name属性: 填写集合 属性的名称 key元素: 配置别人引用我的外键名称 column属性:指定外键名称 one-to-many元素: 描述集合表达的关系.one-to-many表达一对多关系 class属性: 描述我与谁是一对多 cascade 级联 => 配置希望通过set完成哪些级联操作 save-update(偶尔会用): 级联保存|级联更新. 在持久化Customer时,会级联持久化Customer中的瞬时状态(save)对象或游离状态(update)的Order对象 delete(绝对不用): 级联删除. 删除Customer时,会级联删除Customer下的Order all(绝对不用): save-update+delete; delete-orphan(绝对不用):孤儿删除. 自动将不属于任何客户的订单删除. all-delete-orphan(绝对不用): save-update+delete+delete-orphan; none:默认值.没有任何级联操作. inverse 反转 : 配置我是否不维护关联关系 true: 不维护 false(默认值): 维护 --> <set name="orders" > <key column="cid" ></key> <one-to-many class="Order" /> </set> </class> </hibernate-mapping>
补充:<set>元素描述的字段,它的各个属性的含义如下:
(1)name:字段名
(2) table:关联表名
(3)lazy:是否延迟加载。lazy=false表示立即加载
(4)inverse:用于表示双向关联的被动的一端。inverse的值为false的一方负责维护关联关系,默认值为false。
(5)cascade:级联关系。cascade=all表示所有情况下均进行级联操作,即包含save-update和delete操作。
(6)sort:排序关系其可选值为unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了java.util.comparator接口的类型指定排序算法)。
(7)<key>:子元素的column属性指定关联表的外键。
(8)<one-to-many>:子元素的class属性指定了关联类的名字。
2.2、双向关联
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.domain" > <class name="Order" table="t_order" > <id name="id" > <generator class="native"></generator> </id> <property name="price" ></property> <!-- many-to-one元素: 表达多对一关系 name属性: 引用的对象属性名 column属性: 我引用对方的外键名称 class属性: 表达我与谁是多对一关系 Cascade属性 save-update(偶尔): 保存订单时,级联保存客户(自动将关联的瞬时转持久). 更新订单时,级联更新客户(自动将游离转持久). delete(绝对不用): 删除订单时,级联删除与我关联的客户(自动将关联的持久转瞬时). all(绝对不用): save-update+delete; none(最常用): 默认值.没有级联 inverse属性不存在. => 多的一方必须维护外键.不能放弃. --> <many-to-one name="customer" column="cid" class="Customer" ></many-to-one> </class> </hibernate-mapping>
3、多对多
下面以学生(Student)和课程(Coursel)为例:
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.domain" > <class name="Student" table="t_student" > <id name="id" > <generator class="native"></generator> </id> <property name="name" ></property> <!-- set元素: 表达集合 name属性: 集合的属性名 table属性: 指定多对多中间表表名 key元素: 配置外键名称 column属性: 填外键名称 many-to-many元素: 表达我与Course是多对多关系 class属性:我与谁有多对多关系 column属性: 我引用别人的外键名称键 --> <set name="courses" table="t_sutdent_course" > <key column="sid" ></key> <many-to-many class="Course" column="cid" ></many-to-many> </set> </class> </hibernate-mapping>
Course.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.domain" > <class name="Course" table="t_course" > <id name="id" > <generator class="native"></generator> </id> <property name="name" ></property> <!-- set元素: 表达集合 name属性: 集合的属性名 table属性: 指定多对多中间表表名 key元素: 配置外键名称 column属性: 填外键名称 many-to-many元素: 表达我与Course是多对多关系 class属性:我与谁有多对多关系 column属性: 我引用别人的外键名称键 cascacde属性: 选择级联操作 save-update(偶尔使用) 级联保存和更新与我关联的对象 delete(绝对不用) 级联删除与我关联的对象 all(绝对不用) save-update+delete delete-orphan(绝对不用) 孤儿删除 all-delete-orphan(绝对不用) all+delete-orphan none(常用) 默认值 inverse属性: 选择我是否不维护关联关系 false: 我维护 (默认值) true: 我不维护 注意:多对多关系中,必须有一方放弃维护关联关系. --> <set name="students" table="t_sutdent_course" inverse="true" > <key column="cid" ></key> <many-to-many class="Student" column="sid" ></many-to-many> </set> </class> </hibernate-mapping>