对象间的各种关系(一对一,多对一,多对多)都可能存在,从任何一个对象出发去寻找并操作与之关联的对象的过程称为级联操作。
在级联操作中,必须清楚的知道被操作对象目前所处的状态,避免出现异常。
下面以简单的实例做演示。
实例
Customer
package com.xiu.hibernate.cascade;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 客户对象
* @author Administrator
*
* 客户与订单是一对多的关系
*
*/
public class Customer implements Serializable {
private Integer id;
private String cname;
private String bank;
private String phone;
private Set<Orders> orders = new HashSet<Orders>();
setter和getter方法在这里去除
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xiu.hibernate.cascade">
<class name="Customer" table="customer">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="cname" type="string" column="cname"></property>
<property name="phone" type="string" column="phone"></property>
<property name="bank" type="string" column="bank"></property>
<set name="orders" cascade="all" inverse="true" lazy="false">
<!-- cascade表示级联,他有以下取值
1. all: 表示所有操作均在关联层级上进行连锁操作
2. save-upate 表示只有save与update操作进行连锁操作
3. delete 表示只有delete操作进行连锁操作
4. all-delete-orphan
inverse 若为false表示主控制方负责关联关系的维护,若为true表示
有被控制方来维护关系,默认是false
-->
<key column="customer_id"></key>
<one-to-many class="com.xiu.hibernate.cascade.Orders" />
</set>
</class>
</hibernate-mapping>
Goodscate
package com.xiu.hibernate.cascade;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 商品分类
* @author Administrator
*
* 商品分类与商品是一对多的关系
*
*/
public class Goodscate implements Serializable {
private Integer id;
private String cateNo;//分类编号
private String cateName; //分类名称
private Goodscate parent; //父类别
// 子类别集合
private Set<Goodscate> childs = new HashSet<Goodscate>();
// 商品
private Set<Items> items = new HashSet<Items>();
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xiu.hibernate.cascade">
<class name="Goodscate" table="goodscate">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="cateNo" type="string" column="cate_no"></property>
<property name="cateName" type="string" column="cate_name"></property>
<!-- 映射子类别到父类别的多对一 -->
<many-to-one name="parent"
class="com.xiu.hibernate.cascade.Goodscate" column="parent_id"
lazy="false">
</many-to-one>
<!-- 映射父类别到子类别,是一对多关系 -->
<set name="childs" cascade="all" lazy="true" inverse="true">
<key column="parent_id"></key>
<one-to-many class="com.xiu.hibernate.cascade.Goodscate"/>
</set>
<!-- 映射Goodscate与Items的一对多的关系 -->
<set name="items" cascade="all" lazy="true" inverse="true">
<key column="cate_id"></key>
<one-to-many class="com.xiu.hibernate.cascade.Items"/>
</set>
</class>
</hibernate-mapping>
Items
package com.xiu.hibernate.cascade;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 商品持久对象
* @author Administrator
*
* 商品和订单是多对多的关系
* 与商品类别是 多对一的关系
*
*/
public class Items implements Serializable {
private Integer id;
private String itemno; //商品编号
private String itemname; //商品名称
//一个商品可以分配到都个订单中
private Set<Orders> orders = new HashSet<Orders>();
private Goodscate goodscate;
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xiu.hibernate.cascade">
<class name="Items" table="items">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="itemno" type="string" column="itemno"></property>
<property name="itemname" type="string" column="itemname"></property>
<!-- 映射Items到Goodscate的多对一关联 -->
<many-to-one name="goodscate" column="cate_id"
class="com.xiu.hibernate.cascade.Goodscate" lazy="false"
not-null="true">
</many-to-one>
<!-- 映射Items到Orders的多对多单向关联 -->
<set name="orders" table="selecteditems" lazy="true"
inverse="true" cascade="save-update">
<key column="itemid"></key>
<many-to-many class="com.xiu.hibernate.cascade.Orders"
column="orderid">
</many-to-many>
</set>
</class>
</hibernate-mapping>
Orders
package com.xiu.hibernate.cascade;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 订单对象
* @author Administrator
*
* 一个订单只能属于一个用户的,
* 一个用户可以有多个订单
* 所以 订单和客户是多对一的关系
*
* 订单与商品是多对多的关系
*
*/
public class Orders implements Serializable {
private Integer id;
private String orderno;
private Double money;
// 商品 一个订单可以包含多个商品
private Set<Items> items = new HashSet<Items>();
private Customer customer;
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xiu.hibernate.cascade">
<class name="Orders" table="orders">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="orderno" type="string" column="orderno"></property>
<property name="money" type="double" column="money"></property>
<!-- 映射orders到items的多对多的关系 -->
<set name="items" table="selecteditems" lazy="true"
cascade="save-update">
<key column="orderid"></key>
<many-to-many class="com.xiu.hibernate.cascade.Items"
column="itemid">
</many-to-many>
</set>
<!-- 映射orders到customer的多对一关系 -->
<many-to-one name="customer" column="customer_id"
class="com.xiu.hibernate.cascade.Customer" lazy="false"
not-null="true">
</many-to-one>
</class>
</hibernate-mapping>
本文通过具体实例介绍了在 Hibernate 框架中如何处理对象间的一对多、多对一和多对多关系,重点阐述了级联操作的概念及其在实际应用中的重要性,包括如何确保操作过程中对象状态的正确性。
7818

被折叠的 条评论
为什么被折叠?



