zoukankan      html  css  js  c++  java
  • 05Hibernate一对多操作

    以客户和联系人为例,客户是一,联系人是多。

    第一步:创建两个实体类,客户和联系人

    第二步:让两个实体类之间相互表示

    1、客户实体类中表示多个联系人, 即一个客户里面有多个联系人

     1     //在客户中表示多个联系人
     2     /**
     3      * 在hibernate中要求使用集合表示多的数据,并且要求使用set集合
     4      * @return
     5      */
     6     private Set<LinkMan> setsLinkMan = new HashSet<LinkMan>();
     7     
     8     public Set<LinkMan> getSetsLinkMan() {
     9         return setsLinkMan;
    10     }

    2、在联系人实体类中表示所属客户,及一个联系人只能属于一个客户

     1     /**
     2      * 在联系人中表示所属的客户,一个联系人只能属于一个客户
     3      * @return
     4      */
     5     private Customer customer;
     6     
     7     public Customer getCustomer() {
     8         return customer;
     9     }
    10     public void setCustomer(Customer customer) {
    11         this.customer = customer;
    12     }

    Customer.java

     1 package cn.kispine.entity;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 public class Customer {
     7     private Integer cid;     //客户主键id
     8     private String custName;
     9     private String custLevel;
    10     private String custSource;    //客户来源
    11     private String custPhone;
    12     private String custMobile;
    13     
    14     //在客户中表示多个联系人
    15     /**
    16      * 在hibernate中要求使用集合表示多的数据,并且要求使用set集合
    17      * @return
    18      */
    19     private Set<LinkMan> setsLinkMan = new HashSet<LinkMan>();
    20     
    21     public Set<LinkMan> getSetsLinkMan() {
    22         return setsLinkMan;
    23     }
    24     public void setSetsLinkMan(Set<LinkMan> setsLinkMan) {
    25         this.setsLinkMan = setsLinkMan;
    26     }
    27     public Integer getCid() {
    28         return cid;
    29     }
    30     public void setCid(Integer cid) {
    31         this.cid = cid;
    32     }
    33     public String getCustName() {
    34         return custName;
    35     }
    36     public void setCustName(String custName) {
    37         this.custName = custName;
    38     }
    39     public String getCustLevel() {
    40         return custLevel;
    41     }
    42     public void setCustLevel(String custLevel) {
    43         this.custLevel = custLevel;
    44     }
    45     public String getCustSource() {
    46         return custSource;
    47     }
    48     public void setCustSource(String custSource) {
    49         this.custSource = custSource;
    50     }
    51     public String getCustPhone() {
    52         return custPhone;
    53     }
    54     public void setCustPhone(String custPhone) {
    55         this.custPhone = custPhone;
    56     }
    57     public String getCustMobile() {
    58         return custMobile;
    59     }
    60     public void setCustMobile(String custMobile) {
    61         this.custMobile = custMobile;
    62     }
    65 }

    LinkMan.java

     1 package cn.kispine.entity;
     2 
     3 public class LinkMan {
     4     private Integer lkm_id;        //联系人主键id
     5     private String lkm_name;
     6     private String lkm_gender;
     7     private String lkm_phone;
     8     
     9     /**
    10      * 在联系人中表示所属的客户,一个联系人只能属于一个客户
    11      * @return
    12      */
    13     private Customer customer;
    14     
    15     public Customer getCustomer() {
    16         return customer;
    17     }
    18     public void setCustomer(Customer customer) {
    19         this.customer = customer;
    20     }
    21     public Integer getLkm_id() {
    22         return lkm_id;
    23     }
    24     public void setLkm_id(Integer lkm_id) {
    25         this.lkm_id = lkm_id;
    26     }
    27     public String getLkm_name() {
    28         return lkm_name;
    29     }
    30     public void setLkm_name(String lkm_name) {
    31         this.lkm_name = lkm_name;
    32     }
    33     public String getLkm_gender() {
    34         return lkm_gender;
    35     }
    36     public void setLkm_gender(String lkm_gender) {
    37         this.lkm_gender = lkm_gender;
    38     }
    39     public String getLkm_phone() {
    40         return lkm_phone;
    41     }
    42     public void setLkm_phone(String lkm_phone) {
    43         this.lkm_phone = lkm_phone;
    44     }    
    45 }

    第三步:配置映射关系

    1、一般情况下每个实体类都有一个自己的配置文件

    2、把两个实体类最基本的配置文件配置完成

    3、在配置文件中配置一对多的关系

      在客户映射文件中,表示所有的联系人

      在联系人映射文件中,表示所属客户

    LinkMan.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5     
     6 <hibernate-mapping>
     7     <!-- 1、配置实体类与表对应 -->
     8         <!-- class标签、name属性:实体类的全路径、table属性:数据库表名称 -->
     9     <class name="cn.kispine.entity.LinkMan" table="tab_linkman">
    10         <!--2、配置实体类中的唯一字段id与数据库的id对应 -->
    11             <!-- name属性:实体类中字段名称、column:生产的表的字段名称 -->
    12         <id name="lkm_id" column="lkm_id">
    13             <!-- 3、配置数据库表主键的增长策略 :native:自动增长,uuid:生成GUID主键等等-->
    14             <generator class="native"></generator>
    15         </id>
    16         
    17         <!-- 4、配置其他属性和字段的对应关系 -->
    18         <property name="lkm_name" column="lkm_name"></property>
    19         <property name="lkm_gender" column="lkm_gender"></property>
    20         <property name="lkm_phone" column="lkm_phone"></property>
    21         
    22         <!-- 表示联系人所属的客户 
    23             name:Customer对象的名称
    24             class:Customer类对象的全路径
    25             column:外键名称,注意两个配置文件中外键名称保持一致
    26         -->
    27         <many-to-one name="customer" class="cn.kispine.entity.Customer" 
    28         column="clid"></many-to-one>
    29     </class>
    30 </hibernate-mapping>
    View Code

    Customer.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     5     
     6 <hibernate-mapping>
     7     <!-- 1、配置实体类与表对应 -->
     8         <!-- class标签、name属性:实体类的全路径、table属性:数据库表名称 -->
     9     <class name="cn.kispine.entity.Customer" table="tab_customers">
    10         <!--2、配置实体类中的唯一字段id与数据库的id对应 -->
    11             <!-- name属性:实体类中字段名称、column:生产的表的字段名称 -->
    12         <id name="cid" column="cid">
    13             <!-- 3、配置数据库表主键的增长策略 :native:自动增长,uuid:生成GUID主键等等-->
    14             <generator class="native"></generator>
    15         </id>
    16         
    17         <!-- 4、配置其他属性和字段的对应关系 -->
    18         <property name="custName" column="custName"></property>
    19         <property name="custLevel" column="custLevel"></property>
    20         <property name="custSource" column="custSource"></property>
    21         <property name="custPhone" column="custPhone"></property>
    22         <property name="custMobile" column="custMobile"></property>
    23         
    24         <!-- 使用set标签表示所有联系人 ,name属性值为联系人set集合名称-->
    25         <set name="setsLinkMan">
    26             <!-- 一对多建表,有外键,hibernate机制:双向维护外键
    27                 column属性值为外键名称
    28              -->
    29             <key column="clid"></key>
    30             <!-- 客户的联系人 -->
    31             <one-to-many class="cn.kispine.entity.LinkMan"/>
    32         </set>
    33     </class>
    34 </hibernate-mapping>
    View Code

    第四部:一对多级联操作

    1、级联保存

      添加一个客户,为这个客户添加多个联系人

      方式一:

     1     public void addTest1() {
     2         SessionFactory sessionFactory = null;
     3         Session session = null;
     4         Transaction tx = null;
     5         try {
     6             sessionFactory = HibernateUtils.getSessionFactory();
     7             session = HibernateUtils.getCurrentSession();
     8             
     9             tx = session.beginTransaction();
    10             //添加一个客户并未该客户添加一个联系人
    11             Customer customer = new Customer();
    12             customer.setCustName("Kobe");
    13             customer.setCustLevel("Vip");
    14             customer.setCustSource("QQ");
    15             customer.setCustPhone("110");
    16             customer.setCustMobile("10086");
    17             
    18             LinkMan linkMan = new LinkMan();
    19             linkMan.setLkm_name("James");
    20             linkMan.setLkm_gender("男");
    21             linkMan.setLkm_phone("10010");
    22             
    23             //在客户中表示联系人,在联系人中表示客户,建立联系人和客户之间的关系
    24             customer.getSetsLinkMan().add(linkMan);
    25             linkMan.setCustomer(customer);
    26             
    27             //保存到数据库
    28             session.save(customer);
    29             session.save(linkMan);
    30             
    31             tx.commit();
    32         }catch(Exception e) {
    33             tx.rollback();
    34         }
    35     }
    View Code

      方式二:简化写法

      • 在客户映射文件中进行配置
      • 在客户映射文件set标签进行配置,添加cascade属性
        <set name="setsLinkMan" cascade="save-update">
           <!-- 一对多建表,有外键,hibernate机制:双向维护外键
            column属性值为外键名称 -->
          <key column="clid"></key>
                    <!-- 客户的联系人 -->
          <one-to-many class="cn.kispine.entity.LinkMan"/>
        </set>
      • 创建联系人和客户对象,只需要将联系人放到客户中,最终只需要保存客户即可
         1 public void addTest2() {
         2         SessionFactory sessionFactory = null;
         3         Session session = null;
         4         Transaction tx = null;
         5         try {
         6             sessionFactory = HibernateUtils.getSessionFactory();
         7             session = HibernateUtils.getCurrentSession();
         8             
         9             tx = session.beginTransaction();
        10             //添加一个客户并未该客户添加一个联系人
        11             Customer customer = new Customer();
        12             customer.setCustName("Kobe2");
        13             customer.setCustLevel("Vip2");
        14             customer.setCustSource("QQ2");
        15             customer.setCustPhone("1102");
        16             customer.setCustMobile("100862");
        17             
        18             LinkMan linkMan = new LinkMan();
        19             linkMan.setLkm_name("James2");
        20             linkMan.setLkm_gender("男2");
        21             linkMan.setLkm_phone("100102");
        22             
        23             //在客户中表示联系人,在联系人中表示客户,建立联系人和客户之间的关系
        24             customer.getSetsLinkMan().add(linkMan); 
        25             
        26             //保存到数据库
        27             session.save(customer); 
        28             
        29             tx.commit();
        30         }catch(Exception e) {
        31             tx.rollback();
        32         }
        33     }
        View Code

    2、级联删除

      删除某一个客户,同时将这个客户所有的联系人删除

  • 相关阅读:
    如何降低微服务测试成本?我的经验之谈
    Serverless 在 SaaS 领域的最佳实践
    技术干货 | “选图预览并上传”的场景如何解?全网最全方案汇总来了
    SRE技术保障平台-盯屏中心TAC: 混合云一站式告警运维平台
    DTCC 2020 | 阿里云王涛:阿里巴巴电商数据库上云实践
    中值滤波算法 C
    python logger.debug_python中的logger模块讲解
    唯一值
    接触jeecgBoot低代码开发
    php数字操作
  • 原文地址:https://www.cnblogs.com/kispine/p/8934905.html
Copyright © 2011-2022 走看看