單向一對多:
在一的一端 實體內加一個set
映射文件中加入
<set name="users"> <key column="groupid"/> <one-to-many class="User" /> </set>
這樣寫,需要先將多的一端保存,再保存一的一端,然後更新多的一端的外鍵:
sql:
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: insert into t_group (name) values (?)
Hibernate: update t_user set groupid=? where id=?
如果在set標籤內加入級聯:cascade="all"
這樣不用單獨保存多的一端,在保存一端的時候會級聯保存多的實體。
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: update t_user set groupid=? where id=?
這樣都會執行更新語句較麻煩
雙向一對多:
在一的一端,同 單向一對多的一
在多的一端,實體,加入一個“一”的實體
映射文件加入:<many-to-one name="groupid" class="Group" />
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content) values (?, ?, ?)
Hibernate: update t_user set groupid=? where id=?
在一的一端 加入反轉控制: inverse="true"
sql:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, password, content, groupid) values (?, ?, ?, ?)
引自其它資料:
關於inverse屬性:
inverse主要用在一對多和多對多雙向關聯上,inverse可以被設置到集合標籤<set>上,
默認inverse爲false,所以我們可以從”一“一端和”多“一端維護關聯關係,
如果設置成inverse爲true,則我們只能從多一端來維護關聯關係
inverse和cascade
* inverse是關聯關係的控制方向
* cascade操作上的連鎖反應