1. 程式人生 > >Hibernate在配置 one-to-many時應該注意的事項

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來關聯兩個類