天天看點

Hibernate4之cascade與inverse

[size=medium]

[b]簡單地說,“inverse”決定哪一邊來更新外鍵,而“cascade”決定接下來應該執行什麼操作。在關系上來看兩者看上去非常相似,但實際上是完全不同的兩回事。[/b]

[color=red][b]inverse[/b][/color]

inverse,英文意思是反向,反轉。在這裡可以了解為控制反轉,也就是說實體間的關系由誰控制,是以inverse用在實體關聯上。如OneToOne,OneToMany,ManyToMany,在OneToMany中,如果不指定inverse,(inverse通過mappedBy來設定)那麼hibernate會去找預設的表來維持關系。

這個關鍵字被用來決定關系的哪一方是負責維護關系的關系所有者(插入或更新外鍵列)

下面給出一個示例,關系所有者屬于stockDailyRecords(inverse=true)[/size]

[size=medium]當我們儲存或更新stock對象時,Hibernate将隻插入或更新STOCK表,而不更新外鍵列。

[color=red][b]cascade(級聯)[/b][/color]

在級聯中,在完成一個操作(增、删、改)之後,它決定自己是否需要在另一個與它有關系的實體上調用其他操作(增、删、改)。級聯的注解形式有兩種:

[color=blue]基于Hibernate的注解形式:[/color]

[b]ALL[/b],//所有操作都會有級聯反應

[b]PERSIST[/b]//級聯持久化,調用session.persist()時會觸發級聯事件

[b]MERGE[/b]//級聯儲存或者更新,hibernate為了支援jpa規範添加的,調用session.merge()時觸發

[b]REMOVE[/b],//級聯删除,jpa規範同上,調用session.delete()時觸發

[b]DELETE[/b],//級聯删除,session.delete()觸發

[b]SAVE_UPDATE[/b],//級聯儲存或者更新session.save(),update(),saveOrUpdate()會觸發;

[b]REPLICATE[/b],//調用session.replicate()觸發

[b]REFRESH[/b],//調用session.refresh()觸發

[b]LOCK[/b],//調用session.lock()觸發

[b]DETACH[/b],//與持久對象關聯的Session被關閉後觸發

[color=blue]基于JPA規範,也就是apache jsr220規範,也是EJB3的持久層規範:[/color]

[b]ALL[/b],//所有操作都會有級聯反應

[b]PERSIST[/b],//調用session.persist()時觸發

[b]MERGE[/b],//調用session.merge()觸發

[b]REMOVE[/b],//調用session.delete()觸發

[b]REFRESH[/b],//調用session.refresh()觸發

[b]DETACH[/b],//與持久對象關聯的Session被關閉後觸發

具體注解的配置用法請看我之前的博文

下面給出一個XML配置示例,在這個例子中,在Stock.hbm.xml的stockDailyRecords内聲明了cascade="save-update"級聯。[/size]

[size=medium]當我們儲存或修改stock對象時:它将插入或更新記錄到STOCK表中,并在StockDailyRecord上調用另外的插入或更新語句(cascade="save-update")[/size]

繼續閱讀