1. 程式人生 > >Hibernate的關聯關係對映之一對多對映

Hibernate的關聯關係對映之一對多對映

1. 編寫客戶和聯絡人的JavaBean程式(注意一對多的編寫規則)

* 客戶的JavaBean如下

public class Customer {

private Long cust_id;

private String cust_name;

private Long cust_user_id;

private Long cust_create_id;

private String cust_source;

private String cust_industry;

private String cust_level;

private String cust_linkman;

private String cust_phone;

private String cust_mobile;

//一方中對多方物件的引用

private Set<Linkman> linkmans = new HashSet<Linkman>();

}

* 聯絡人的JavaBean如下

public class Linkman {

private Long lkm_id;

private String lkm_name;

private String lkm_gender;

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;

}

4. 編寫客戶和聯絡人的對映配置檔案(注意一對多的配置編寫)

* 客戶的對映配置檔案如下

<class name="com.itheima.domain.Customer" table="cst_customer">

<id name="cust_id" column="cust_id">

<generator class="native"/>

</id>

<property name="cust_name" column="cust_name"/>

<property name="cust_user_id" column="cust_user_id"/>

<property name="cust_create_id" column="cust_create_id"/>

<property name="cust_source" column="cust_source"/>

<property name="cust_industry" column="cust_industry"/>

<property name="cust_level" column="cust_level"/>

<property name="cust_linkman" column="cust_linkman"/>

<property name="cust_phone" column="cust_phone"/>

<property name="cust_mobile" column="cust_mobile"/>

<!--一對多關係的配置

name:實體類中多方物件集合的屬性名

-->

<set name="linkmans">

<!--指定表中關聯的外來鍵欄位-->

<key column="lkm_cust_id"/>

<!---多方物件的全路徑名->

<one-to-many class="com.huge.domain.Linkman"/>

</set>

</class>

* 聯絡人的對映配置檔案如下

<class name="com.itheima.domain.Linkman" table="cst_linkman">

<id name="lkm_id" column="lkm_id">

<generator class="native"/>

</id>

<property name="lkm_name" column="lkm_name"/>

<property name="lkm_gender" column="lkm_gender"/>

<property name="lkm_phone" column="lkm_phone"/>

<property name="lkm_mobile" column="lkm_mobile"/>

<property name="lkm_email" column="lkm_email"/>

<property name="lkm_qq" column="lkm_qq"/>

<property name="lkm_position" column="lkm_position"/>

<property name="lkm_memo" column="lkm_memo"/>

<!--多對一關係的配置-->

<many-to-one name="customer" class="com.huge.domain.Customer" column="lkm_cust_id"/>

</class>

**技術分析之儲存客戶和聯絡人的資料**

1. 進行雙向關聯進行資料的儲存

**技術分析之級聯儲存**

1. 測試:如果現在程式碼只插入其中的一方的資料

* 如果只儲存其中的一方的資料,那麼程式會丟擲異常。

* 如果想完成只儲存一方的資料,並且把相關聯的資料都儲存到資料庫中,那麼需要配置級聯!!

* 級聯儲存是方向性

2. 級聯儲存效果

* 級聯儲存:儲存一方同時可以把關聯的物件也儲存到資料庫中!!

* 使用cascade="save-update"

**技術分析之級聯刪除**

1. 先來給大家在資料庫中演示含有外來鍵的刪除客戶功能,那麼SQL語句是會報出錯誤的

* 例如:delete from customers where cid = 1;

2. 如果使用Hibernate框架直接刪除客戶的時候,測試發現是可以刪除的

3. 上述的刪除是普通的刪除,那麼也可以使用級聯刪除,注意:級聯刪除也是有方向性的!!

* <many-to-one cascade="delete" />

**技術分析之級聯的取值(cascade的取值)和孤兒刪除**

1. 需要大家掌握的取值如下

* none                                                -- 不使用級聯

* save-update                                    -- 級聯儲存或更新

* delete                                              -- 級聯刪除

* delete-orphan                                  -- 孤兒刪除.(注意:只能應用在一對多關係)

* all                                                    -- 除了delete-orphan的所有情況.(包含save-update delete)

* all-delete-orphan                            -- 包含了delete-orphan的所有情況.(包含save-update delete delete-orphan)

2. 孤兒刪除(孤子刪除),只有在一對多的環境下才有孤兒刪除

* 在一對多的關係中,可以將一的一方認為是父方.將多的一方認為是子方.孤兒刪除:在解除了父子關係的時候.將子方記錄就直接刪除。

* <many-to-one cascade="delete-orphan" />

**技術分析之讓某一方放棄外來鍵的維護,為多對多做準備**

1. 先測試雙方都維護外來鍵的時候,會產生多餘的SQL語句。

* 想修改客戶和聯絡人的關係,進行雙向關聯,雙方都會維護外來鍵,會產生多餘的SQL語句。

* 產生的原因:session的一級快取中的快照機制,會讓雙方都更新資料庫,產生了多餘的SQL語句。

2. 如果不想產生多餘的SQL語句,那麼需要一方來放棄外來鍵的維護!

* 在<set>標籤上配置一個inverse=”true”.true:放棄.false:不放棄.預設值是false

* <inverse="true">

**技術分析之cascade和inverse的區別**

1. cascade用來級聯操作(儲存、修改和刪除)

2. inverse用來維護外來鍵的