初入Hibernate框架<三>
多表級聯問題:
將外鍵操作也配置進框架:
級聯,1方更新,被關聯的數據也更新
刪除1方,被關聯的數據都刪除
1、cascade級聯操作
所謂cascade,如果有兩個表,在更新一方的時候,可以根據對象之間的關聯關係,對被關聯方進行相應的更新。比如說院系表和學生表之間是一對多關係,使用cascade, 如刪除院系表中的一條院系記錄時,該院系下的所有學生記錄也自動刪除。這種現象稱爲級聯刪除。當創建一個新的院系實例,該院系實例集合屬性中保存有學生。當該院系實例持久化時,自動將集合學生也自動添加到數據庫的學生表中去。這稱爲級聯增加。
在前面的基礎上,用學生與部門表來演示:
//Student.hbm.xml中的<class name="Student" table="students" catalog="hib">屬性中添加:
<many-to-one name="dept" class="Dept" fetch="select">
<!-- 配置表中的外鍵 -->
<column name="deptId" length="8"></column>
</many-to-one>
//Student.hbm.xml中與Student映射並列:
<class name="Dept" table="depts" catalog="hib">
<id name="id" type="java.lang.String">
<column name="id" length="8"></column>
<generator class="assigned"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="40"></column>
</property>
<!-- cascade="all"對所有進行關聯操作 -->
<set name="students" table="students" inverse="true" cascade="all">
<key>
<column name="deptId"></column><!-- 配置外鍵字段 -->
</key>
<one-to-many class="Student"/>
</set>
</class>
這裏也可以在寫一個xxx.hbm.xml,然後在src/hibernate.cfg.xml文件中配置
延時加載:
(1) 屬性的延遲加載
如Person表有一個人員圖片字段(對應java.sql.Clob類型)屬於大數據對象,當我們加載該對象時,我們不得不每一次都要加載這個字段,而不論我們是否真的需要它,而且這種大數據對象的讀取本身會帶來很大的性能開銷。我們可以如下配置我們的實體類的映射文件:
在xxx.hbm.xml配置文件中,
<hibernate-mapping>
<class name="bean.Person" table="person">
……
<property name="pimage" type="java.sql.Clob"
column="pimage" lazy="true"/>
</class>
</hibernate-mapping>