• hibernate学习(5)——一对多关系表达


    一对多实现

    1、 实现类

    package com.alice.hibernate02.vo;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Customer {
        private Integer id;
        private String name;
        // 一对多:一个客户(当前客户) 拥有 【多个订单】
        // * 需要容器存放多个值,一般建议Set (不重复、无序)
        // * 参考集合:List、Map、Array等
        // ** 建议实例化--使用方便
    
        private Set<Order> orders = new HashSet<Order>();
    
    public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } }
    package com.alice.hibernate02.vo;
    
    public class Order {
        private Integer id;
        private String name;
      //多对一:多个订单属于【一个客户】
        private Customer customer;
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Customer getCustomer() {
    		return customer;
    	}
    	public void setCustomer(Customer customer) {
    		this.customer = customer;
    	}
    }
    

      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="com.alice.hibernate02.vo">
         <class name="Customer" table="t_customer">
            <id name="id" column="id">
               <generator class="native"></generator>
            </id>
            <property name="name" column="name" type="string"></property>
            <!-- 表达一对多关系中的集合
                 name:集合的属性名称
                 inverse: 是否将关系的维护反转给对方. 默认值: false
                        true: 在Customer 中 放弃维护外键关系
                        
                 cascade :级联操作
                     save-update:级联保存,级联修改. 保存A时,同时保存B. 
                    delete:删除A,同时删除B,AB都不存在
                    delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
                    如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
                    
                    all : save-update 和 delete 整合
                    all-delete-orphan : 三个整合
                     
              -->
            <set name="orders">
            <!--
                     key 用来描述外键
                     column : 外键的值
                   -->
              <key column="cid"></key>
              <one-to-many class="Order"/>
            </set>
         </class>
    </hibernate-mapping>
    <?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="com.alice.hibernate02.vo">
         <class name="Order" table="t_order">
            <id name="id" column="id">
               <generator class="native"></generator>
            </id>
            <property name="name" column="name" type="string"></property>
            <!-- 表达一对多关系中的集合
                 name:集合的属性名称
                 inverse: 是否将关系的维护反转给对方. 默认值: false
                        true: 在Customer 中 放弃维护外键关系
                        
                 cascade :级联操作
                     save-update:级联保存,级联修改. 保存A时,同时保存B. 
                    delete:删除A,同时删除B,AB都不存在
                    delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
                    如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
                    
                    all : save-update 和 delete 整合
                    all-delete-orphan : 三个整合
                     
              -->
            <!-- 表达多对一关系 
                 name: 引用的属性名称
                 column: 外键的列名
                 class: 我引用的Order的完整类名
             -->
             <many-to-one name="customer" column="cid" class="Customer"></many-to-one>
         </class>
    </hibernate-mapping>

    3、一对多操作

     1 public void test01() {
     2         Session session = HibernateUtil.openSession();
     3         Transaction tran = session.beginTransaction();
     4 
     5         Customer cus = new Customer();
     6         cus.setName("alice");
     7 
     8         Order o1 = new Order();
     9         o1.setName("apple");
    10 
    11         Order o2 = new Order();
    12         o2.setName("banana");
    13 
    14         cus.getOrders().add(o1);// 维护关系
    15         cus.getOrders().add(o2);// 维护关系
    16 
    17         o1.setCustomer(cus);
    18         o2.setCustomer(cus);
    19 
    20         session.save(cus);//保存对象
    21         session.save(o1);//保存对象
    22         session.save(o2);//保存对象
    23 
    24         tran.commit();
    25 
    26         session.close();
    27 
    28     }

    4、   级联操作(读、理解)

    save-update:A保存,同时保存B

    delete:删除A,同时删除B,AB都不存在

    delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。

    如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">

    all : save-update 和 delete 整合

    all-delete-orphan : 三个整合

    package com.alice.hibernate02.many;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.alice.hibernate02.util.HibernateUtil;
    import com.alice.hibernate02.vo.Customer;
    import com.alice.hibernate02.vo.Order;
    
    //测试 一对多关系
    public class ManyTest02 {
      
        @Test
        ////我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
        //cascade: save-update
        public void test01() {
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
    
            Customer cus = new Customer();
            cus.setName("alice");
    
            Order o1 = new Order();
            o1.setName("apple");
    
            Order o2 = new Order();
            o2.setName("banana");
    
            cus.getOrders().add(o1);// 维护关系
            cus.getOrders().add(o2);// 维护关系
    
    //        o1.setCustomer(cus);
    //        o2.setCustomer(cus);
    
            session.save(cus);//保存对象
    //        session.save(o1);//保存对象
    //        session.save(o2);//保存对象
    
            tran.commit();
    
            session.close();
    
        }
        @Test
         ////我们希望在保存Customer时,自动将未保存的Orders当中的Order保存
          //cascade: save-update
        public void test02() {
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
    
            Customer cus = (Customer) session.get(Customer.class, 2);//1条 select
            
            for(Order o :cus.getOrders()){// 1条 select
                o.setName("mike");// 修改订单
            }
            
            tran.commit();//因为设置级联修改,自动将订单的修改保存到数据
    
            session.close();
    
        }
      //cascade: delete
          //删除Customer时 ,会将Customer下的订单一并删除
          //inverse : false   6条sql语句   
          //inverse : true    5条sql语句 比上面少一条维护外键
        @Test
        public void test03() {
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
    
            Customer cus = (Customer) session.get(Customer.class, 3);//1条 select
            
            session.delete(cus);//删除Customer
             // 删除两个Order
            
            tran.commit();//因为设置级联修改,自动将订单的修改保存到数据
    
            session.close();
    
        }
      //cascade: delete
          //操作的两方cascade值都为delete
          //需要注意: 千万不要在两方都配置 级联删除. 删除任何一方,会导致整个关系链对象全部删除.
        @Test
        public void test04() {
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
    
            Order o =(Order) session.get(Order.class, 6);
            
            session.delete(o);//删除Customer
             // 删除两个Order
            
            tran.commit();//因为设置级联修改,自动将订单的修改保存到数据
    
            session.close();
    
        }
        
    }
    package com.alice.hibernate02.many;
    
    import java.util.Iterator;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.alice.hibernate02.util.HibernateUtil;
    import com.alice.hibernate02.vo.Customer;
    import com.alice.hibernate02.vo.Order;
    
    //测试 一对多关系
    public class ManyTest03 {
        @Test
        //inverse:false
            //cascade: delete-orphan 孤儿删除 => 当没有任何外键引用Order时,order 会被删除
        public void test02(){
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
            
            Customer cus = (Customer) session.get(Customer.class, 4);
            Iterator<Order> iter = cus.getOrders().iterator();
            //注意: 删除Customer下的订单时,不能使用 c.setOrders(null); c.setOrders(new HashSet());
            while(iter.hasNext()){// 遍历Customer下的订单,并将订单删除 => 维护关系
                iter.next();
                iter.remove();
            }
            //cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan
    
    
        }
        //cascade: all-delete-orphan => 相当于配置 save-update,delete,delete-orphan
        @Test
        public void fun1(){
            Session session = HibernateUtil.openSession();
            Transaction tran = session.beginTransaction();
            //------------------------------------------------
            Customer c = new Customer();
            c.setName("tom");
            
            Order o1 = new Order();
            o1.setName("肥皂");
            
            Order o2 = new Order();
            o2.setName("蜡烛");
            
            c.getOrders().add(o1);//维护关系
            c.getOrders().add(o2); //维护关系
            
            session.save(c);
            //------------------------------------------------
                session.getTransaction().commit();
                session.close(); // 游离状态
        }
    }
  • 相关阅读:
    linux系统中sed命令删除指定行后的下一行
    linux系统中删除文件的最后几行
    linux系统中sed命令删除指定行及其后的若干行
    linux系统中sed命令整行替换
    linux系统中sed命令在指定行前(后)插入内容
    CVE-2010-3333-office RTF栈溢出漏洞分析
    BM 算法
    HDFS 的 API 操作
    linux 服务器使用百度网盘
    linux 下配置java JDK1.8
  • 原文地址:https://www.cnblogs.com/snowwang/p/6123949.html
Copyright © 2020-2023  润新知