hibernate 映射四多对一双向映射
學(xué)生和班級(jí)的例子來(lái)說(shuō),多個(gè)學(xué)生可以對(duì)應(yīng)一個(gè)班級(jí)。
1.站在學(xué)生角度來(lái)說(shuō),學(xué)生就是多端。那么我們可以通過(guò)多對(duì)一來(lái)維護(hù)2者的關(guān)系。
2.站在班級(jí)的角度來(lái)說(shuō),班級(jí)就是一端。那么我們可以通過(guò)一對(duì)多啦維護(hù)2者的關(guān)系。
3.我們也可以雙向關(guān)聯(lián)兩者的關(guān)系。(這個(gè)要牽涉到了反轉(zhuǎn))
?
無(wú)論是多對(duì)一還是一對(duì)多,最終生成的數(shù)據(jù)庫(kù)的表中,都會(huì)在多的一端增加了一個(gè)外鍵來(lái)關(guān)聯(lián)一的一端。
?
首先先站在學(xué)生的角度上 多對(duì)一:
最終生成的數(shù)據(jù)庫(kù):
?
下面是多對(duì)一映射中的字段意思:
?
一對(duì)多中:
?
生成的表結(jié)構(gòu)和多對(duì)一 一樣。
保存的時(shí)候,先保存一端,然后保存多端。也就是先保存student,然后保存clazz。
但是這樣會(huì)造成一個(gè)問(wèn)題,因?yàn)閟tudent中會(huì)多一個(gè)字段cid,但是保存student 的時(shí)候我們操作的是對(duì)象而不是數(shù)據(jù)庫(kù)
發(fā)后臺(tái)的語(yǔ)句:
?//保存student
?Hibernate: insert into Student (name, sex, age) values (?, ?, ?)? //并沒(méi)有插入cid的值,這也是為什么student的cid配置不能為null的原因。
?//保存class
?Hibernate: insert into Clazz (name) values (?)
?
?//commit的時(shí)候會(huì)發(fā)送更新語(yǔ)句。
?Hibernate: update Student set cid=? where id=?
所以我們不建議使用一端來(lái)維護(hù)多端。所以我們這就出現(xiàn)了反轉(zhuǎn),把維護(hù)的工作交給了多端來(lái)維護(hù)。保存,修改,刪除,都由多端來(lái)維護(hù)。
所以在一端我們就可以加入??<set name="student" inverse="true">
inverse="true"是雙向關(guān)聯(lián)的概念,使用了這個(gè),再進(jìn)行一端維護(hù)多段是不能關(guān)聯(lián)cid的。所以就必須用多端維護(hù)。
?
下面就是雙向關(guān)聯(lián):
?
?這樣,這樣進(jìn)行保存的時(shí)候,只能先保存一端然后再保存多端。反之操作cid將不會(huì)update,cid也就不會(huì)有值。
?
反向工程:
點(diǎn)擊finish就可以了.
?
關(guān)于fetch,以后詳細(xì)再說(shuō)。
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/RanNing/p/3472257.html
總結(jié)
以上是生活随笔為你收集整理的hibernate 映射四多对一双向映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 获取linux服务器基本信息脚本
- 下一篇: 体验最火的敏捷——SCRUM(厦门,20