hibernate 十, 持久化对象间的级联操作

本文通过具体实例介绍了在 Hibernate 框架中如何处理对象间的一对多、多对一和多对多关系,重点阐述了级联操作的概念及其在实际应用中的重要性,包括如何确保操作过程中对象状态的正确性。


    对象间的各种关系(一对一,多对一,多对多)都可能存在,从任何一个对象出发去寻找并操作与之关联的对象的过程称为级联操作。

在级联操作中,必须清楚的知道被操作对象目前所处的状态,避免出现异常。


下面以简单的实例做演示。


实例


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>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值