以客户和联系人为例,客户是一,联系人是多。
第一步:创建两个实体类,客户和联系人
第二步:让两个实体类之间相互表示
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>
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>
第四部:一对多级联操作
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 }
方式二:简化写法
-
- 在客户映射文件中进行配置
- 在客户映射文件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 }
2、级联删除
删除某一个客户,同时将这个客户所有的联系人删除
*********************** KISPINE ***********************