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、级联删除

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

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/kispine/p/8934905.html
Copyright © 2011-2022 走看看