Hibernate中id设置

1、“assigned” 
  
主键由外部程序负责生成,在   save()   之前指定一个。   
    
  2、
“hilo” 
  
通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。    
 <id name="id" type="int" column="id"> 
<generator class="hilo"> 
<param name="table">表名</param> 
<param name="column">字段名</param> 
<param name="max_lo">100</param> 
</generator> 
</id>   
  
3、“seqhilo” 
  
与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。    
    <id name="id" type="int" column="id"> 
<generator class="seqhilo"> 
<param name="sequence">hi_value</param> 
<param name="max_lo">100</param> 
</generator> 
</id>
  

hi: 高值--从数据库wasw100_hilo_tbl读取的next_value值

lo: 低值--hibe自动维护,从0到max_lo(看下面)

max_lo: 配置文件中<param name="max_lo">100</param>的值,这里是100

hibernate根据hilo生成器生成主键的过程:

1.读取并记录数据库的wasw100_hilo_tbl表中next_value字段的值,数据库中此字段值加1保存

2.hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)

取得hi值和lo值后,根据下面的公式计算主键值:

hi*(max_lo+1)+lo;

4、“increment” 

  
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。   
 
<id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>   

5、
“identity” 
  
采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。  
  
    <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

6、“sequence” 
  
采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。    
   <id name="id" type="long">
   <column name="ID" not-null="true" sql-type="NUMBER" unique="true"/>
   <generator class="sequence">
    <param name="sequence">序列名</param>    
   </generator>
  </id> 
7、
“native” 
  
由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。 
  <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>   
    
  
8、“uuid.hex” (最常用的生成方式)
  
由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。 
 
<id name="id" type="java.lang.String">
            <column name="ID" />
            <generator class="uuid.hex" />
        </id> 
9、
“uuid.string” 
  
与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。 
    
  
10、“foreign” 
  
使用另外一个相关联的对象的标识符作为主键。 

本文讲解Hibernate中hbm的generator子元素的一些内置生成器的快捷名字。Generator子元素是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。IDCard与Student形成一对一关联,IDCard端的设置映射配置如下:

<class name="IDCard">

        <id name="id" column="Card_id">

           <generator class="foreign">

              <param name="property">student</param>

           </generator>

       </id>      

        <property name="IDNo" unique="true"/>

        <property name="nationality"/>

        <property name="address"/>

        <one-to-one name="student"  class="Student" constrained="true"/>  

</class>

解释:

(1)<generator class="foreign">

     指定id生成方式, (之前我们用的id生成方式是native,是让底层数据库自动生成id,目前我的应征环境下,native从1开始,递增生成id)。在这里,我们要用外键来生成主键,所以指定为foreign,也就是去共享关联对象的主键。

(2)<param name="property">student</param>

    指定主键来源,这里的student是关联名称。

(3)<one-to-one name="student"  class="Student" constrained="true"/>  

     指定与Student形成一对一关联,

(4)constrained=”true”

该选项最关键的是影响save和delete的先后顺序

没有设定时:总是先操作关联表,后操作本表;

设定以后:添加时先关联表,后本表;删除时先本表,再操作关联表。


版权声明:本文为Jesse_Suo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>