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

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

原文地址:https://www.cnblogs.com/kispine/p/8934905.html