论坛首页 Java企业应用论坛

<generator>的用法——我的理解,请大家补充指正!

浏览 7705 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-09-18  
<generator>表示一个主键的生成机制。即具体通过何种方式来生成。
格式为:
<generator 
   class="generatorClass"/>
   <param name=”paramName”>”paramValue</param>
</generator>


所有的<generator>的Class都是从net.sf.hibernate.id.IdentifierGenerator接口实现得到的,Class属性表示该generator是由哪种方式来生成的。生成方式包括:

increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server,  Sybase and HypersonicSQL
sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
                                                             
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。

<generator>用法举例:

<id name="id" type="long" column="cat_id">
   <generator class="hilo">
      <param name="table">hi_value</param>
      <param name="column">next_value</param>
      <param name="max_lo">100</param>
   </generator>
</id>
   发表时间:2003-12-16  
tuskrabbit 写道
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库

一般,数据库会对数字型的primary key提供查询优化。采用uuid.hex(String型)的话,岂不是用不得数据库的这种优化功能?会降低查询或连接的效率吗?
0 请登录后投票
   发表时间:2003-12-17  
而且,我想自己按照uuid.hex的原理将hibernate原有的uuidhexGenerator改写成只生成16位16进制字符串。
但是,我不知道要怎样做才能保证每次生成的id肯定是唯一的。
(在看hibernate的uuidHexGenerator类的源码时,我知道它是通过对IP地址、System.currentTimeMillis()进行位移等操作来形成一个ID,但是我并不知道它是采用何种算法来保证生成的id的唯一性的。恕我愚笨,还望赐教。)

另外,hibernate的uuid.hex算法应该是修改过的uuid算法——一般意义上的uuid算法应该是取本机的MAC地址,而hibernate里取的是IP地址。这会在何种程度上影响生成的id的唯一性(除了“在局域网外可能不唯一”这一点外)。
0 请登录后投票
   发表时间:2003-12-18  
ffeliza 写道
tuskrabbit 写道
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库

一般,数据库会对数字型的primary key提供查询优化。采用uuid.hex(String型)的话,岂不是用不得数据库的这种优化功能?会降低查询或连接的效率吗?


数值型PK的查询效率要比String类型好很多。如果系统数据量很大,对于性能要求比较高的话,那么这些项目应该在开始的时候就会定下来实际运行的数据库。根据数据库的支持,可以选择identity or sequence (绝大多数数据库都会支持其中之一)。而且这2种都有很好的open source的DB支持(MySQL, HSQL for identity, SAPDB, PSQL for sequence),开发的时候使用这些数据库,测试or运行的时候再切换到Oracle, DB2,是很方便的。

退一步来说,即使是真的需要更换运行环境的数据库,search * mapping files, replace all,
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics