【SSH】SSH之Hibernate框架:Hibernate的主键生成策略

您所在的位置:网站首页 hibernate身份生成策略 【SSH】SSH之Hibernate框架:Hibernate的主键生成策略

【SSH】SSH之Hibernate框架:Hibernate的主键生成策略

2023-09-04 15:33| 来源: 网络整理| 查看: 265

主键:

自然主键:用表中一个有实际意义的字段(对应持久化类中的一个有实际意义的属性)来作为主键,例如创建的一个人员表,用人员的身份证号作为主键。 代理主键:不是表中一个有实际意义的字段,它的存在仅仅是用来作为每条记录的唯一标识。在设置主键的时候通常用代理主键,因为自然逐渐是一个有实际意义的字段,有可能会更改,而代理主键没有实际意义,不存在后续更改的情况。

Hibernate的代理主键生成策略:

在实际开发中一般不允许用户设置主键,而是由程序自动生成,Hibernate提供的的主要的主键生成策略有以下几种:

increment:适用short、int、long类型的主键,实现原理是首先发送一个sql语句查询表中最大的id,然后将该id+1作为新纪录的id。从原理可以看到该方法存在线程安全问题,因为如果是多个线程同时操作时,新的记录还没插入表中,新的线程就查询到了还没增加的id,此时该线程也会生成一个与上一个线程相同的id,就会发生id冲突。因此,该方法应在单线程中使用。identity:适用short、int、long类型的主键,使用的是数据库底层的自动增长机制,因此不会出现线程安全问题。但是应该注意的是,DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 等数据库有自动增长机制,而Oracle没有。sequence:适用short、int、long类型的主键,DB2,PostgreSQL,Oracle,SAP DB,McKoi 等数据库使用序列(sequence), 而MySQL不支持序列,不能使用sequence。uuid:适用String类型的主键,使用该主键生成策略后,Hibernate会自动生成随机字符串作为主键。native:本地策略,本地用的MySQL数据库则使用identity策略,本地用的是Oracle数据库则使用sequence策略。assigned:如果使用该策略,则hibernate会放弃对主键的生成管理,让应用程序在调用 save() 之前为对象分配一个标识符。这是 元素没有指定时的 默认生成策略。此时需要通过编写程序生成或用户自己来设置。foreign:使用另外一个相关联的对象的标识符。它通常和 联合起来使用。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3