Hibernate中id generator属性解析

    简单的说,generator是为我们快速高效生成主键的。对于主键,相信我们大家都非常了解,如何选择主键,往往是我们必须考虑的事情。

    在做.NETJW项目的时候,我们使用过GUID来生成主键,好处不言而喻,这次在Hibernate中遇到了同样类型的主键生成机制,所以总结一下。

 

    这里主要介绍Hibernate中几个比较常见的主键生成方式

1、assigned

   使用这种策略,要求我们程序员手动输入主键。在save()之前为对象分配一个标示符,这是默认生成策略。

2、identity

   由数据库自己生成的、自增长序列,DB2,MySQL, MS SQL Server,Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。

3、sequence

   按照一定规则自动增加的数字序列,DB2,PostgreSQL, Oracle, SAP DB,McKoi中使用,返回的标识符是long, short或者 int类型的。

4、native

   根据底层数据库的能力选择identity, sequence 。也就是说这种方式,把主键生成交给了底层,不同的数据库根据自己的机制生成,可移植性较好。

   以上三种生成机制,都是使用自增长的原理,这样我们就不必再关心主键的问题,但是必须要注意,他们是自增的,我们的主键字段必须是可以自动增长类型的。

5、uuid

   用一个128-bit的UUID算法生成字符串类型的标识符,在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

6、foreign

   参照另外一个相关联的表的主键生成的。通常和<one-to-one>联合起来使用。

7、increment

   Hibernate从数据库中取出主键的最大值,以该值为基础,每次增量为1,在内存中生成主键在初始化阶段,Hibernate读取表中的最大主键值,当插入记录时,在最大值基础上递增,增量为1。但是,如果有两个Hibernate应用进程访问同一个数据库表,可能出现同时获取相同的最大值,导致出现相同的主键值,从而有一个进程插入失败。因为是自增型,所以ID字段也必须是long、int或short型

 

   identitysequence是有兼容性问题的,不同的数据库支持的策略不同,相对来说native解决了这个问题;increase有多进程并发问题,但是可移植性好;uuid唯一并且可移植性好,但是字段值较长,耗费资源。总之,这些方法各有各的好处,我们选择哪一种使用,还要看具体的环境和业务的要求。

你可能感兴趣的:(Hibernate中id generator属性解析)