zoukankan      html  css  js  c++  java
  • hibernate_03_hibernate一对多的关系映射

    1.实体类的一对多的关系映射

    一个客户对应多个联系人

    Customer.java

    public class Customer {
        private Long cust_id;
        private String cust_name;
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_phone;
        private String cust_mobile;
        // 通过ORM方式表示:一个客户对应多个联系人。
        // 放置的多的一方的集合。Hibernate默认使用的是Set集合。
        private Set<LinkMan> linkMans = new HashSet<LinkMan>();   
    }

     LinkMan.java

    public class LinkMan {
        private Long lkm_id;
        private String lkm_name;
        private String lkm_gender;
        private String lkm_phone;
        private String lkm_mobile;
        private String lkm_email;
        private String lkm_qq;
        private String lkm_position;
        private String lkm_memo;
        // 通过ORM方式表示:一个联系人只能属于某一个客户。
        // 放置的是一的一方的对象。
        private Customer customer;
    }

     2.映射文件的一对多的关系映射

    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.work.entity.Customer" table="cst_customer">
            <!-- 建立OID与主键映射 -->
            <id name="cust_id" column="cust_id">
                <generator class="native"/>
            </id>
            <!-- 建立普通属性与数据库表字段映射 -->
            <property name="cust_name" column="cust_name" />
            <property name="cust_source" column="cust_source"/>
            <property name="cust_industry" column="cust_industry"/>
            <property name="cust_level" column="cust_level"/>
            <property name="cust_phone" column="cust_phone"/>
            <property name="cust_mobile" column="cust_mobile"/>
            <!-- 配置一对多的映射:放置的多的一方的集合 -->
            <!-- 
                set标签 :
                    * name    :多的一方的对象集合的属性名称。
                    * cascade:级联
                    * inverse:放弃外键维护权。inverse="true"
            -->
            <set name="linkMans" cascade="save-update,delete">
                <!--
                     key标签
                        * column:多的一方的外键的名称。
                 -->
                <key column="lkm_cust_id"/>
                <!-- 
                    one-to-many标签
                        * class    :多的一方的类的全路径
                 -->
                <one-to-many class="com.work.entity.LinkMan"/>
            </set>
        </class>
    </hibernate-mapping>

     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.work.entity.LinkMan" table="cst_linkman">
            <!-- 建立OID与主键映射 -->
            <id name="lkm_id" column="lkm_id">
                <generator class="native"/>
            </id>
            <!-- 建立普通属性与表字段映射 -->
            <property name="lkm_name"/>
            <property name="lkm_gender"/>
            <property name="lkm_phone"/>
            <property name="lkm_mobile"/>
            <property name="lkm_email"/>
            <property name="lkm_qq"/>
            <property name="lkm_position"/>
            <property name="lkm_memo"/>
            <!-- 配置多对一的关系:放置的是一的一方的对象 -->
            <!-- 
                many-to-one标签
                    * name        :一的一方的对象的属性名称。
                    * class        :一的一方的类的全路径。
                    * column    :在多的一方的表的外键的名称。
             -->
            <many-to-one name="customer" cascade="save-update,delete" class="com.work.entity.Customer" column="lkm_cust_id"/>
        </class>
    </hibernate-mapping>

     3.一对多的操作

    1>保存一个客户,和客户下的两个联系人

    @Test
        public void saveOrUupdate() {
    
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
    
            Customer customer = new Customer();
            customer.setCust_name("xj");
    
            LinkMan linkMan1 = new LinkMan();
            linkMan1.setLkm_name("hdh");
    
            LinkMan linkMan2 = new LinkMan();
            linkMan1.setLkm_name("hdh");
    
            customer.getLinkMans().add(linkMan1);
            customer.getLinkMans().add(linkMan2);
    
            session.save(customer);
            session.save(linkMan1);
            session.save(linkMan2);
    
            tx.commit();
    
        }

    2>通过级联进行保存一个客户,和客户下的两个联系人

    级联操作: 级联指的是,操作一个对象的时候,会同时操作其关联的对象。

    级联操作需要对进行操作的一方进行配置:cascade="save-update,delete"

    <set name="linkMans" cascade="save-update,delete" inverse="true">
                <!--
                     key标签
                        * column:多的一方的外键的名称。
                 -->
                <key column="lkm_cust_id"/>
                <!-- 
                    one-to-many标签
                        * class    :多的一方的类的全路径
                 -->
                <one-to-many class="com.work.entity.LinkMan"/>
            </set>

     通过级联操作只需要对一方进行更新

    保存级联操作:保存客户客户对应的联系人也保存了

    @Test
        public void saveOrUupdate2() {
    
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
    
            Customer customer = new Customer();
            customer.setCust_name("lq");
    
            LinkMan linkMan1 = new LinkMan();
            linkMan1.setLkm_name("hdh");
    
            LinkMan linkMan2 = new LinkMan();
            linkMan2.setLkm_name("xj");
    
            customer.getLinkMans().add(linkMan1);
            customer.getLinkMans().add(linkMan2);
    
            //进行了级联操作 只需要更新一方
            session.save(customer);
    
            tx.commit();
        }

     删除级联操作:删除客户客户对应的联系人也删除了

     @Test
        public void delete() {
    
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
    
            Customer customer = session.get(Customer.class, 2L);
            session.delete(customer);
    
            tx.commit();
    
        }

     更新级联操作

    @Test
        public void update() {
    
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
    
            //进行级联更新
            Customer customer = session.get(Customer.class, 3L);
            LinkMan linkMan = session.get(LinkMan.class, 5l);
    
            //关联
            customer.getLinkMans().add(linkMan);
            linkMan.setCustomer(customer);
    session.update(customer); tx.commit(); }

     4.cascadeinverse的区别

    cascade:是控制关联的对象

    inverse:是控制 一的一方是否有放弃外键的维护权

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Oracle 不同故障的恢复方案
    IBM HACMP 系列 后期安装工作和管理任务二
    How to map SCN with Timestamp before 10g [ID 365536.1]
    ORA02024: Database Link Not Found [ID 1058949.1]
    IBM HACMP 系列 后期安装工作和管理任务三
    IBM System p5 服务器 HACMP 安装指南
    Oracle 不同用户之间 大量数据转移的方法测试
    Oracle 不同故障的恢复方案
    Nocatalog 下的RMAN 增量备份 shell脚本
    IBM HACMP 系列 安装和配置二
  • 原文地址:https://www.cnblogs.com/asndxj/p/12061306.html
Copyright © 2011-2022 走看看