學生和班級的例子來講,多個學生能夠對應一個班級。數據庫
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,之後詳細再說。