您的位置:首页 > 其它

Hibernate的主键生成策略

2013-04-06 09:05 176 查看
对于不同的数据库和应用程序,主键的生成方式往往不同

Hibernate的主键生成策略分为3大类:Hibernate对主键id附值,应用程序对主键id附值,由数据库对id附值

1.Hibernate对主键id附值:

increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。

这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能产生同样的主键,从而造成主键重复的异常。因此,如果同 一个数据库有多个实例访问,这种方式应该避免使用

2.应用程序对主键id附值:即编程人员自己对主键id附值或者使用相关联对象的主键

foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用。

assigned:应用程序自身对id附值。当在xml中设置<generator class="assigned"> 或者用annotation来设置(hibernate提供了多种生成器供选择,基于Annotation的方式通过@GenericGenerator实现,通过@GenericGenerator来提供一个id生成器)

@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

这样指定后,编程人员就应该自己负责主键id的负值

3.由数据库对id附值:即你所用的数据库:eg,SQL Server2008,Oracle,MySQL它们来负责对主键id负值

native: 对于 oracle 采用 Sequence 方式对主键id负值,对于MySQL 和 SQL Server 采用identity(自增主键生成机制,生成整型的id),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)。

identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,对于Oracle要设定sequence(MySQL 和 SQL Server 中很常用)。
等同于JPA中的INDENTITY。

sequence: 使用Oracle数据库的主键id生成策略,调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。

uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型),适用于主键为String类型的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: