hibernate 多對多 中間表主鍵問題 及id生成方式

hibernate多對多中間表,一般都是兩個外鍵,例如
用戶表(user,主鍵:
userid.
角色表(role,主鍵:
roleid.
中間表字段爲兩個外鍵:useridroleid作爲聯合主鍵。

但是如果想在中間表加一個字段作爲單獨的主鍵,即設置一個字段id作爲主鍵。並且數據庫採用的是oracle數據庫,主鍵不能自增。那麼採用hibernate向中間表插數據的時候,就會出現問題,即主鍵id字段插入爲空,會報錯誤。


由於oracle不支持自動編號,爲解決以上錯誤,我們還得爲oracle數據庫創建一個SEQUENCE(序列)語句如
create sequence t_user_role_seq cache 20 increment by 1 start with 100 nomaxvalue;
hibernate中的映射文件可這麼寫

 

  1. <id name="id" type="java.lang.Long" column="ID"> 
  2.          <generator class="sequence" > 
  3.             <param name="sequence"> t_user_role_seq </param> 
  4.          </generator> 
  5. </id> 

小結:

對於oracle數據庫:
如果單純的多對多關係不生成中間表的配置文件那中間表就不要ID主鍵,只要useridroleid兩個外鍵。

如果中間表設置一個字段id作爲主鍵,那麼就需要配置中間表文件,並設置sequence,這是因爲oracle的主鍵不會自動增加,需要通過設置sequence來增加。

 

 

附錄:id生成方式
1
,序列sequence 只適用於Oracle

  1. <id name="id" column="id"> 
  2. <generator class="sequence"> 
  3. <param name="sequence">person_seq</param><!--指定sequence名--> 
  4. </generator> 
  5. </id> 

2
,自增列,適用於SQLServerMySql

 

  1. <id name="id" column="id"> 
  2. <generator class="identity"/> 
  3. </id>

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="hilo">
<param name="table">high_value</param>
<!--
設置高位值取值的表-->
<param name="column">next_value</param>
<!--
設置高位值取值的字段-->
<param name="max_lo">50</param>
<!--
指定低位最大值,當取道最大值是會再取一個高位值再運算-->
</generator>
</id>


以上是hilo算法的普通形式,不適合用於squenece
在一個會話中保存多個對象


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章