Hibernate級聯持久化對象

級聯保存和更新
當Hibernate持久化一個臨時對象時,在默認情下,他不會自動持久化所關聯的其他臨時對象,如果希望當持久化對象時把他所關聯的所有臨時對象進行持久化的話:可以把 的cascade屬性設置爲"save-update" ,cascade的默認屬性值爲none。
cascade:設置操作對象時的級聯操作,即層級之間的連鎖操作
值 save-update :表示當保存和更新當前對象(即insert和update語句時),會級聯保存和更新與他關聯的對象
值 all :表示任何情況下都會進行級聯操作,即對一個對象進行操作,也會對和他關聯的其他對象進行同樣的操作
值 delete :表示在執行delete時,進行級聯操作,刪除和他關聯的對象
值 none :表示任何情況下,都不會進行級聯操作
<set>元素的inverse屬性

在運行上面的程序時,如果hibernate的"show-sql"設置爲true時,就會看到Hibernate會生成很多sql語句,其實很多sql語句都是重複的
eg: 
insert into  test.order(o_name,c_id)values(?,?)
insert into  test.order(o_name,c_id)values(?,?)
insert into  test order   set c_id=? where id=?
insert into  test order   set c_id=? where id=?

爲了解決這個問題,我們可以利用在<set>標籤中加上inverse屬性。術語:inverse是指反轉的意思,在Hibernate中,表示關聯關係中的方向關聯關係中,inverse="false"的主控方,由主動方負責維護對象關係我們 在customer對象的對象配置文件中加上

<set name="orders"  cascade="save-update" inverse="true">
<key  column="c_id" > </key>
<one-to-many class="net.mbs.mypack.Order " />
</set>

聲明在Customer和Order的雙向關聯關係中,Customer端的關聯只是Order端關聯的鏡象(即Order端是主空端,負責維護 Customer和order對象之間的關聯關係),當hibernate探測到持久化對象Customer或Order的狀態發生變化時(主要是關聯關 系的改變),僅按照Order對象的狀態的變化來同步更新數據庫。
按次配置,如果在程序中,我們僅僅使用Customer.getOrder().add(order)(涉及了和Order的關聯關係的改變),是不能讓 數據庫跟對象的變化來進行數據庫同步更新的,只有利用Order對象的方法改變的Order對象狀態 (eg:order.setCustomer(customer)----涉及到了和Customer的關聯關係的改變)時,數據庫纔會根據變化來同步更 新數據庫,即只有主控方的狀態(涉及到了和另一方面的關聯關係的改變)發生了變化後,纔會觸發對象和數據庫的同步更新。

映射一對多雙向關聯關係
當類與類之間建立了關聯,就可以方便的從一個對象導航到另一個對象或一組與他關聯的對象當中,根據上面的程序,對於一個給定的Order對象,如果想獲取與他關聯的Customer對象,我們只需要調用入下方法:
Customer c=order.geCustomer(); 那麼當我們得到一個Customer對象後,想查出和這個 Customer對象關聯的所有Order對象時,應該怎麼辦呢?由於在Customer中沒有建立對Order對象的關聯,所以,不能通過加載 Customer對象來自動加載和他關聯的所有Order對象,唯一的方法只能通過JDBC或SQL語言人工寫出代碼來查詢數據庫Order表來返回所需 要的信息
上面的問題雖然解決,但不能算是最好,因爲這樣性能會有所下降,對象位於內存中,在內存中從一個對象導航到另一個對象顯然比到數據庫中查詢數據要快得多

具體實現<br>
1:由於Customer和Order是一對多,即一個Customer要對應多個Order,所以在Customer中應該建立一個Set對象,用於存放和本Customer對象關聯的所有Order對象。
2:在customer.hbm.xml通過<one-to-many>建立對Order表的關聯關係
注意:<one-to-many>應該放置在<set>標籤中 
我們先來看看Customer類的設計和customer.hbm.xml文件的內容
<br><br><br>------------------------------------------------------
Customer Order 雙向一對多
1:Customer類中建立一個容器對象,包含關聯的所有Order對象
2:Order類中建立一個Customer對象,關聯Customer
inverse="true"表示將維護關聯的權利交給引起Hibernate語句的生成

customer.getOrders().add(order);
customer.setName("dddddd");

inverse="true"(設置此屬性的一方----是被控方)
當主控方修改對象之間的關聯關係時,讓Hibernate生成sql語句

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章