hibernate 映射<四>多對一雙向映射

學生和班級的例子來講,多個學生能夠對應一個班級。數據庫

1.站在學生角度來講,學生就是多端。那麼咱們能夠經過多對一來維護2者的關係。fetch

2.站在班級的角度來講,班級就是一端。那麼咱們能夠經過一對多啦維護2者的關係。3d

3.咱們也能夠雙向關聯二者的關係。(這個要牽涉到了反轉)對象

 

不管是多對一仍是一對多,最終生成的數據庫的表中,都會在多的一端增長了一個外鍵來關聯一的一端。blog

 

首先先站在學生的角度上 多對一:ci

最終生成的數據庫:it

 

下面是多對一映射中的字段意思:class

 

一對多中:後臺

 

生成的表結構和多對一 同樣。配置

保存的時候,先保存一端,而後保存多端。也就是先保存student,而後保存clazz。

可是這樣會形成一個問題,由於student中會多一個字段cid,可是保存student 的時候咱們操做的是對象而不是數據庫

發後臺的語句:
 //保存student
 Hibernate: insert into Student (name, sex, age) values (?, ?, ?)  //並無插入cid的值,這也是爲何student的cid配置不能爲null的緣由。


 //保存class
 Hibernate: insert into Clazz (name) values (?)
 
 //commit的時候會發送更新語句。
 Hibernate: update Student set cid=? where id=?

因此咱們不建議使用一端來維護多端。因此咱們這就出現了反轉,把維護的工做交給了多端來維護。保存,修改,刪除,都由多端來維護。

因此在一端咱們就能夠加入  <set name="student" inverse="true">

inverse="true"是雙向關聯的概念,使用了這個,再進行一端維護多段是不能關聯cid的。因此就必須用多端維護。

 

下面就是雙向關聯:

 

 這樣,這樣進行保存的時候,只能先保存一端而後再保存多端。反之操做cid將不會update,cid也就不會有值。

 

反向工程:

點擊finish就能夠了.

 

關於fetch,之後詳細再說。

相關文章
相關標籤/搜索