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中的映射文件可這麼寫
java

 

   
   
            
   
   
  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 在一個會話中保存多個對象
相關文章
相關標籤/搜索