hibernate多對多中間表,一般都是兩個外鍵,例如
用戶表(user),主鍵:userid.
角色表(role),主鍵:roleid.
中間表字段爲兩個外鍵:userid,roleid作爲聯合主鍵。
但是如果想在中間表加一個字段作爲單獨的主鍵,即設置一個字段id作爲主鍵。並且數據庫採用的是oracle數據庫,主鍵不能自增。那麼採用hibernate向中間表插數據的時候,就會出現問題,即主鍵id字段插入爲空,會報錯誤。
用戶表(user),主鍵:userid.
角色表(role),主鍵:roleid.
中間表字段爲兩個外鍵:userid,roleid作爲聯合主鍵。
但是如果想在中間表加一個字段作爲單獨的主鍵,即設置一個字段id作爲主鍵。並且數據庫採用的是oracle數據庫,主鍵不能自增。那麼採用hibernate向中間表插數據的時候,就會出現問題,即主鍵id字段插入爲空,會報錯誤。
由於oracle不支持自動編號,爲解決以上錯誤,我們還得爲oracle數據庫創建一個SEQUENCE(序列)語句如
create sequence t_user_role_seq cache 20 increment by 1 start with 100 nomaxvalue;
在hibernate中的映射文件可這麼寫
- <id name="id" type="java.lang.Long" column="ID">
- <generator class="sequence" >
- <param name="sequence"> t_user_role_seq </param>
- </generator>
- </id>
小結:
對於oracle數據庫:
如果單純的多對多關係不生成中間表的配置文件那中間表就不要ID主鍵,只要userid和roleid兩個外鍵。
如果單純的多對多關係不生成中間表的配置文件那中間表就不要ID主鍵,只要userid和roleid兩個外鍵。
如果中間表設置一個字段id作爲主鍵,那麼就需要配置中間表文件,並設置sequence,這是因爲oracle的主鍵不會自動增加,需要通過設置sequence來增加。
附錄:id生成方式
1,序列sequence 只適用於Oracle
- <id name="id" column="id">
- <generator class="sequence">
- <param name="sequence">person_seq</param><!--指定sequence名-->
- </generator>
- </id>
2,自增列,適用於SQLServer、MySql
|
3,取最大值加一
<id name="id" column="id" type="integer">
<generator class="increment"/> </id> |
4,根據底層數據庫指定生成方法
<id name="id" column="id">
<generator class="native"/> </id>
|
使用缺省策略
針對Oracle數據庫的生成方式還是sequence,只不過需要一個特定名字的sequence,"hibernate_sequence"。
5,高低位算法
<id name="id" column="id">
<generator class=" <param name="table">high_value</param> <!--設置高位值取值的表--> <param name="column">next_value</param> <!--設置高位值取值的字段--> <param name="max_lo">50</param> <!--指定低位最大值,當取道最大值是會再取一個高位值再運算--> </generator> </id> |
以上是hilo算法的普通形式,不適合用於squenece
在一個會話中保存多個對象