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用來維護外來鍵的