Hibernate在配置 one-to-many時應該注意的事項
其實配置one-to-many的對映很簡單,就是在one所代表的這個類中新增一個集合物件,一般用set,來儲存對應的many所代表的那個類的物件,比如,一個person對應多個order,(一個人對應多個訂單),那麼在person類中新增private Set<Order> order ;這個屬性,然後提供get,set方法,然後在Person.hbm.xml中配置
<set name="order">
<key column="userid" />
<one-to-many class="Order" />
</set>
這樣,一個單向的一對多關係就配置完成了,在主程式中新建order物件,儲存進set中,再把person.setOrder(set),然後儲存order物件,儲存person物件就行了。但是這樣配置有很大的問題,在資料庫中的處理是先是往order表和person表中插入資料,但是order表的外來鍵列插入的是null,然後執行更新語句,更新order表的外來鍵列,把它設定成對應的personid
如下控制檯輸出的資訊:(裡面有張表是userinfo而不是personinfo)
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: update ORDERINFO set USERID=? where oid=?
Hibernate: update ORDERINFO set USERID=? where oid=?
Hibernate: update ORDERINFO set USERID=? where oid=?
這樣操作的話效能就很不好了,
如果設定雙向一對多關聯,那麼就很好了,就是在order類中加一個屬性private Person person,然後提供get,set方法,然後在Order.hbm.xml中配置
<many-to-one name="person" class="Person" column="personid" />,然後在主程式中,order.set(person),要設定值(控制關聯關係),其他的和上面的一樣,這樣
控制檯輸出資訊如下:
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
就只有4條插入語句在操作資料庫了。
關於雙向一對多的操作注意一下幾點:(引用自李剛的JAVAEEssh整合開發那本書)
1.先持久化one的物件
2.先設定one和many的關聯關係,在儲存many物件,否則還是會出現先插入,然後再更新的重複操作資料庫的現象
3.不要通過one的那一端來控制關聯關係,可以設定set的inverse=“true”來控制,或者在主程式中不通過設定set來關聯兩個類