SSH框架:一对多数据表处理

一对多案例
假设一个客户有多个联系人,客户和联系人是一对多的关系,他们的数据表如下,客户表的主键是联系人表的外键,在联系人表知道外键值通过查询客户表,就可以知道联系人对应的客户的相关信息
这里写图片描述

javaBean和配置文件
在hibernate框架处理一对多的关系,关键要写好数据表对应的javaBean和配置文件

一方:在CustomerBean.java里面,要添加set集合,代表客户所以对应的联系人
然后在配置文件,配置set集合,具体写法参照下面的代码

多方:在LinkManBean.java里面,要添加Customer对象,代表联系人所对应的客户
然后在配置文件,具体写法参照下面的代码

Customer.java

public class Customer {

    private Long cust_id;
    private String cust_name;
    // Hibernate框架默认的集合是set集合,集合必须要自己手动的初始化
    private Set<Linkman> linkmans = new HashSet<Linkman>();

    public Long getCust_id() {
        return cust_id;
    }
    public void setCust_id(Long cust_id) {
        this.cust_id = cust_id;
    }
    public String getCust_name() {
        return cust_name;
    }
    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }

    public Set<Linkman> getLinkmans() {
        return linkmans;
    }
    public void setLinkmans(Set<Linkman> linkmans) {
        this.linkmans = linkmans;
    }
}

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>

    <class name="com.itheima.domain.Customer" table="cst_customer">
        <id name="cust_id" column="cust_id">
            <generator class="native"/>
        </id>

        <property name="cust_name" column="cust_name"/>

        <!-- 配置一方 -->
        <!--
            set标签name属性:表示集合的名称
        -->
        <set name="linkmans" inverse="true">
            <!-- 需要出现子标签 -->
            <!-- 外键的字段 -->
            <key column="lkm_cust_id"/>
            <one-to-many class="com.itheima.domain.Linkman"/>
        </set>      
    </class>

</hibernate-mapping>    

LinkMan.java

public class Linkman {

    private Long lkm_id;
    private String lkm_name;
    // 编写一个对象,不要自己new
    private Customer customer;
    public Long getLkm_id() {
        return lkm_id;
    }
    public void setLkm_id(Long lkm_id) {
        this.lkm_id = lkm_id;
    }
    public String getLkm_name() {
        return lkm_name;
    }
    public void setLkm_name(String lkm_name) {
        this.lkm_name = lkm_name;
    }
    public Customer getCustomer() {
        return customer;
    }
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}

Linkman.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>

    <class name="com.itheima.domain.Linkman" table="cst_linkman">
        <id name="lkm_id" column="lkm_id">
            <generator class="native"/>
        </id>

        <property name="lkm_name" column="lkm_name"/>       
        <!-- 先配置多方 
            name    当前JavaBean中的属性
            class   属性的全路径
            column  外键的字段
        -->
        <many-to-one name="customer" class="com.itheima.domain.Customer" column="lkm_cust_id" cascade="save-update"/>

    </class>

</hibernate-mapping>

级联删除,级联保存

1. 需要大家掌握的取值如下
    * none                      -- 不使用级联
    * save-update               -- 级联保存或更新
    * delete                    -- 级联删除
    * delete-orphan             -- 孤儿删除.(注意:只能应用在一对多关系)
    * all                       -- 除了delete-orphan的所有情况.(包含save-update delete)
    * all-delete-orphan         -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)

2. 孤儿删除(孤子删除),只有在一对多的环境下才有孤儿删除
    * 在一对多的关系中,可以将一的一方认为是父方.将多的一方认为是子方.孤儿删除:在解除了父子关系的时候.将子方记录就直接删除。
    * <many-to-one cascade="delete-orphan" />

级联保存效果
* 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
* 使用cascade=”save-update”
上述的删除是普通的删除,那么也可以使用级联删除,注意:级联删除也是有方向性的!!
*

技术分析之让某一方放弃外键的维护,为多对多做准备

1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
    * 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。

    * 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。

2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
    * 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
    * <inverse="true">

技术分析之cascade和inverse的区别

1. cascade用来级联操作(保存、修改和删除)
2. inverse用来维护外键的

版权声明:本文为mozha_666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。