Hibernate的一對多關聯關係對映
阿新 • • 發佈:2019-01-10
一個客戶可以有多個聯絡人
比如客戶為“中國專業IT社群CSDN”
它所對應的聯絡人可以為“張總”,“陳總”,等等等等
一對多關係
重點程式碼:
實體重點程式碼:
<font color=red >//使用set集合表達一對多關係
Set<LinkMan> linkmans = new HashSet<LinkMan>();</font>
<font color=red>//表達一對多關係
private Customer customer;</font>
對映檔案重點程式碼:
<!-- 配製多對一關係 --> <many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
<!-- 配置一對多關係
-->
<set name="linkmans" cascade="save-update" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
建立客戶實體
package cn.zhicheng.domain; import java.util.HashMap; import java.util.HashSet; import java.util.Set; public class Customer { private long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_phone; private String cust_mobile; private String cust_linkman; //使用set集合表達一對多關係 Set<LinkMan> linkmans = new HashSet<LinkMan>(); public Set<LinkMan> getLinkmans() { return linkmans; } public void setLinkmans(Set<LinkMan> linkmans) { this.linkmans = linkmans; } public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; } public long getCust_id() { return cust_id; } public void setCust_id(long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } }
建立聯絡人實體
package cn.zhicheng.domain; public class LinkMan { private long lkm_id; private Character lkm_gender; private String lkm_name; private String lkm_phone; private String lkm_mobile; private String lkm_email; private String lkm_qq; private String lkm_position; private String lkm_memo; //表達一對多關係 private Customer customer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public long getLkm_id() { return lkm_id; } public void setLkm_id(long lkm_id) { this.lkm_id = lkm_id; } public Character getLkm_gender() { return lkm_gender; } public void setLkm_gender(Character lkm_gender) { this.lkm_gender = lkm_gender; } public String getLkm_name() { return lkm_name; } public void setLkm_name(String lkm_name) { this.lkm_name = lkm_name; } public String getLkm_phone() { return lkm_phone; } public void setLkm_phone(String lkm_phone) { this.lkm_phone = lkm_phone; } public String getLkm_mobile() { return lkm_mobile; } public void setLkm_mobile(String lkm_mobile) { this.lkm_mobile = lkm_mobile; } public String getLkm_email() { return lkm_email; } public void setLkm_email(String lkm_email) { this.lkm_email = lkm_email; } public String getLkm_qq() { return lkm_qq; } public void setLkm_qq(String lkm_qq) { this.lkm_qq = lkm_qq; } public String getLkm_position() { return lkm_position; } public void setLkm_position(String lkm_position) { this.lkm_position = lkm_position; } public String getLkm_memo() { return lkm_memo; } public void setLkm_memo(String lkm_memo) { this.lkm_memo = lkm_memo; } }
建立對映
<?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="zhicheng.domain">
<!-- 建立資料庫表與類的對映 -->
<class name="Customer" table="cst_customer">
<!-- 建立類中屬性與表中主鍵的對應 -->
<id name="cust_id" column="cust_id">
<!-- 配置主鍵生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立類中普通 屬性對應表的欄位的對應-->
<!-- property中還有 length type not-null unique 燈屬性-->
<property name="cust_name" column="cust_name" ></property>
<property name="cust_source" column="cust_source" ></property>
<property name="cust_industry" column="cust_industry" ></property>
<property name="cust_level" column="cust_level" ></property>
<property name="cust_linkman" column="cust_linkman" ></property>
<property name="cust_phone" column="cust_phone" ></property>
<property name="cust_mobile" column="cust_mobile" ></property>
<!-- 配置一對多關係
name 引用屬性名
colomn 配置資料庫表的外來鍵名字
class 與我關聯物件的完整類名
配置級聯操作
cascade屬性
save-update
delete (不建議使用,實際開發會很麻煩)
all
作用:簡化操作,減少程式碼量
inverse屬性 (多的一方預設維護關係)
true customer不維護關係
false (預設值) customer維護關係
-->
<set name="linkmans" cascade="save-update" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</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="cn.zhicheng.domain">
<class name="LinkMan" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_gender"></property>
<property name="lkm_name"></property>
<property name="lkm_phone"></property>
<property name="lkm_mobile"></property>
<property name="lkm_email"></property>
<property name="lkm_qq"></property>
<property name="lkm_position"></property>
<property name="lkm_memo"></property>
<!-- 配製多對一關係 -->
<!--
name屬性名
column 外來鍵列名字
class與我關聯的完整類名
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
</class>
</hibernate-mapping>
級聯操作cascade屬性與inverse屬性
<!-- 配置一對多關係
name 引用屬性名
colomn 配置資料庫表的外來鍵名字
class 與我關聯物件的完整類名
配置級聯操作
cascade屬性
save-update
delete (不建議使用,實際開發會很麻煩)
all
作用:簡化操作,減少程式碼量
inverse屬性 (多的一方預設維護關係)
true customer不維護關係
false (預設值) customer維護關係
-->
<set name="linkmans" cascade="save-update" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
將對映新增到核心配置檔案
<mapping resource="cn/zhicheng/domain/Customer.hbn.xml"/>
<mapping resource="cn/zhicheng/domain/LinkMan.hbn.xml"/>
編寫測試程式碼
package cn.zhicheng.one2many;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itheima.domain.Customer;
import cn.itheima.domain.LinkMan;
import cn.itheima.utils.HibernateUtils;
public class OneToMany {
@Test
/*
* 一對多表格的操作
* 儲存客戶以及客戶下的練習人
*/
public void test(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
Customer customer = new Customer(); //瞬時態
customer.setCust_name("天狗");
LinkMan linkman1 = new LinkMan(); //瞬時態
LinkMan linkman2 = new LinkMan(); //瞬時態
linkman1.setLkm_name("馬爸爸");
linkman2.setLkm_name("張永");
//表達一對多,客戶下有多少個練習人
customer.getLinkmans().add(linkman1);
customer.getLinkmans().add(linkman2);
//表達多對一,聯絡人屬於哪個客戶
linkman1.setCustomer(customer);
linkman2.setCustomer(customer);
session.save(customer); //持久態
session.save(linkman1);
session.save(linkman2);
//提交事務
tx.commit();
//釋放資源
session.close();
}
@Test
//為客戶新增聯絡人
public void test2(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
Customer customer = session.get(Customer.class, 1l);
LinkMan man1 = new LinkMan();
man1.setLkm_name("新增聯絡人");
LinkMan man2 = new LinkMan();
man2.setLkm_name("新增聯絡人2");
customer.getLinkmans().add(man1);
customer.getLinkmans().add(man2);
man1.setCustomer(customer);
man2.setCustomer(customer);
session.save(customer);
session.save(man1);
session.save(man2);
//往客戶新增聯絡人
//變成持久態
//提交事務
tx.commit();
//釋放資源
session.close();
}
@Test
//為客戶刪除聯絡人
public void test3(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
Customer customer = session.get(Customer.class, 1l);
LinkMan linkMan = session.get(LinkMan.class, 4l);
customer.getLinkmans().remove(linkMan);
linkMan.setCustomer(null);
//提交事務
tx.commit();
//釋放資源
session.close();
}
@Test
/*
* 級聯操作
* 儲存客戶已經客戶下的練習人
*/
public void test4(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
Customer customer = new Customer(); //瞬時態
customer.setCust_name("天狗");
LinkMan linkman1 = new LinkMan(); //瞬時態
linkman1.setLkm_name("級聯操作新增");
LinkMan linkman2 = new LinkMan(); //瞬時態
linkman2.setLkm_name("級聯操作新增2");
//表達一對多,客戶下有多少個練習人
customer.getLinkmans().add(linkman1);
customer.getLinkmans().add(linkman2);
//表達多對一,聯絡人屬於哪個客戶
linkman1.setCustomer(customer);
linkman2.setCustomer(customer);
session.save(customer); //持久態
//提交事務
tx.commit();
//釋放資源
session.close();
}
@Test
/*
* 級聯操作
* 刪除客戶以及客戶下的練習人
*/
public void test5(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
Customer customer = session.get(Customer.class, 1l);
session.delete(customer);
//提交事務
tx.commit();
//釋放資源
session.close();
}
}