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 在一个会话中保存多个对象
相关文章
相关标签/搜索