您的位置:首页 > 产品设计 > UI/UE

hibernate主键生成策略全览

2013-03-04 15:21 429 查看
*.hbm.xml文件<generator>是为了对应惟一一条持久化对象,其属性是为设置标识符的生成策略。

有如下代码:

<id name="id" type="java.lang.Integer" column="ID">
<generator class="生成策略"></genterator>
</id>


一、increment生成策略:当在数据库中插入一条记录时,会先获取当前数据库中最大的主键值,现在此基础上加1,用于新的这条记录。也因为这样,限定其类型只能为short,int,long及其封装的类型。这种生成策略适用于单服务器,只能被Hibernate独享,否则不能生成惟一主键。不适合非独享数据库和分布式数据库。

 

二、identity生成策略:在某些可设置自动增长的数据库中,如:MS SQL Server,MySQL,DB2,可以使用这种生成策略,其类型也只能为short ,int ,long及其封装类型。

 

三、sequence生成策略:在比如Oracle数据库可以设置序列(sequence)记录当前主键中使用,其类型可以为short, int, long及其封装类型,其中设置序列名的值参数(<param>)是可选的,如果不

<id name="id" type="java.lang.Integer" column="ID">
<generator class="生成策略">
<param name="sequence">gb_seq</param>
</genterator>
</id>

 

四、hilo生成策略:这是一种高(hi)低(lo)位高效算法生成标识符的策略,其类型为short ,int ,long及其封装类型,这种生成策略需要额外建立一个表和一个字段支持,其配置参数(<param>)是可选的,默认表名为hibernate_unique_key,字段名为next_hi。使用这种生成策略与底层无关,可以在各种数据库下运行。代码如下:

<id name="id" type="java.lang.Integer" column="ID">
<generator class="hilo">
<param name="table">table_key</param>
<param name="column">col_hivalue</param>
</genterator>
</id>

 

五、seqhilo生成策略:这是一种基于指定序列(sequence)产生高低位的算法。与hilo大致相同,只是在配置中需指定序列,但配置项是可选的,默认是使用hibernate_unique_sequence,代码如下:

<id name="id" type="java.lang.Integer" column="ID">
<generator class="seqhilo">
<param name="sequence">hibernate_seq</param>
</genterator>
</id>

 

六、uuid生成策略:采用128位的UUID算法生成一个标识符,这个算法使用IP地址、JVM的启动时间(精确到1/4秒)、系统时间和一个计数值(当前JVM中唯一)通过计算产生一个32位的字符串,所以在配置type项为String类型,由于这个位数大,算法复杂,可以保证多个数据库的主键唯一性,所以可以用于分布式数据库中,在实际应用中也推荐使用,但占用空间也比较大。

 

七、guid生成策略:这种生成策略需要借助如MS SQL Server或MySQL数据库的GUID字符串产生的标识符。设置这种生成策略,需要将数据库中对应的字段类型设为uniqueidentifier。

 

八、native生成策略:根据使用的数据库自动选择identify, sequence, hilo中的一种生成策略。比如MySQL数据库选择identify, Oracle选择sequence。这种生成策略方便数据库的移植

 

九、assigned生成策略:这是由Hibernate自定义标识符属性的数值,即在调用Session的save()方法持久化对象时。首先为对象的标识符赋值。如果<generator>没有配置,则默认使用的是此生成策略

 

十、foreign生成策略:通过关联持久化对象为当前对象的标识符赋值,例如User和Profile类的标识符都是id,Profile通过User的id为其标识符赋值,可以用如下代码:
<id name="id" type="java.lang.Integer" column="ID">
<generator class="foreign">
<param name="property">user</param>
</genterator>
</id>

 

选择标识符属性生成策略

在选择Hibernate提供的标识符属性生成策略时,要具体问题具体分析,如果应用系统不需要分布式部署,在数据库支持的情况下使用sequence、identity、hilo、seqhilo和uuid生成策略都是不错选择;如果应用需要使用多个数据库或者进行分布式的部署,则uuid生成策略是最佳的选择。还有一种情况是使用Hibernate改造遗留系统,可能需要人工采用一定的规则为标识符属性赋值,这时使用assigned生成策略比较合适
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  j2ee hibernate uuid native