http://blog.sina.com.cn/s/blog_4b5bc0110100z483.html
雙方都需要獲取對方數據時 就使用雙向關係
部門--人員
使用人員時
如果只需要獲取對應部門信息(user.getdeptarment())
不需要 從部門下的人員信息時,就配置成單向 多對一
使用部門時
如果只需要獲取部門下人員信息(deptartmanet.getusers())
不需要 從人員獲取部門信息時,就配置成單向 一對多
既要獲取部門下人員 deptartmanet.getusers()
又要從人員獲取部門信息 user.getdeptarment()
那就 配置成雙向一對多,也就是雙向多一
看需求來配置了。
關聯關係的本質是將關聯關係映射到數據庫中。關聯關係在對象模型中體現爲內存中的一個或多個引用。 一對多關係:
一對多關係 分爲“單向一對多/多對一關係”和“雙向多對一”關係。
• “單向一對多/多對一關係”只需在“一”/“多”方進行配置,
• “雙向多對一關係”需要在關聯雙方均加以配置。
雙向多對一關聯就是在多方和一方都進行配置,並在“一” 方通過屬性inverse="true"設置控制關係反轉
注:單向多對一關聯是最常見的單向關聯關係。
注:雙向多對一關聯是最常見的雙向關聯關係。雙向多對一關聯實際上是“多對
一”與“一對多”關聯的組合。
|
多對一及一對多關聯映射的區別(單向):
|
不管多對一還是一對多,都是在"多"的一端添加一個外鍵指向"一"的一端,只不過是多對一是在多的一端爲其自己添外鍵,而一對多則是在一的一端爲多的一端添加外主鍵。
|
模型:一個用戶組(group)對應多個用戶(user)。
|
多對一關聯映射:是在"多"的一端添加一個外鍵指向"一"的一端,它維護的關係爲多到一的關係,如:當載入一個用戶(user)時將會同時載入組(group)的信息。它的關係映射將寫在多的一端(user):
<many-to-one name="group" column="relatedGroup" cascade="all" /> 此時它在多的一端(user)添加了一個外鍵“relateGroup”指向一的一端。在多的一端通過group維護一的一端。
|
一對多關聯映射:是在"一"的一端爲多的一端添加外主鍵,它維護的關係爲一到多的關係,如:當載入一個組(group)時將會同時載入此組用戶(user)的信息。它的關係映射將寫在一的一端(group):
<set name="users" order-by="name">
|
<key column="relatedGroup"/>
|
<one-to-many class="com.dvnchina.hibernate.User"/>
</set>
此時通過<key column="relatedGroup"/>在多的一端(user)添加了一個外鍵“relateGroup”指向一的一端。在一的一端通過users維護多的一端。
|
總之,一對多和多對一的映射策略是一致的,都是通過在"多"的一端添加一個外鍵指向"一"的一端,只是站的角度不同。
個人總結:
1、cascade寫在某方,表示在操作此方時,與此方關聯的另一方是否被操作。此關聯是指操作時對象中包含的對象(比如保存部門時,dept.setEm(em),em對象也被保存)。
比如部門表--員工表,雙向多多對一,cascade="delete"寫在部門表,那麼表示在刪除部門時與此部門相關的員工也全部被刪除!
2、關係的維護(inverse)通常都是交給多方
|