4.2主键生成策略
在<id>元素中通过 <generator class="生成策略"></generator>指定数据表主键生成策略 常用的生成策略有六种
4.2.1 increment
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
原理: select max(id) from customer insert max(id)+1
***使用Increment创建表 没有主键自增长 通过Hibernate在程序中内部完成自增长
***好处是可以跨平台 缺点 高并发访问 可以出现主键的冲突 模仿两个线程同时并发
适用范围
由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
适用于只有单个 Hibernate 应用进程访问同一个数据库的场合
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.2 identity (Mysql)
identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型(加1带走)
原理:依赖数据库内部增长 和Hibernate无关
**创建表 not null auto_increment
**优点无需程序处理 数据库自己完成主键的增长 缺点mysql支持 oracle不支持
***没有线程并发问题
适用范围:
由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型.
支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.3 sequence----Oracle
sequence 标识符生成器利用底层数据库提供的序列来生成标识符
原理:依赖数据库序列的支持 和Hibernate无关
oracle支持序列 mysql不支持序列
序列的原理的:
create sequence customer_sq
insert into customer(id) values(customer_sq.nextval) 序列自动问
适用范围:
适用范围:
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.4 native
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
适用范围:
由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4,2.5 uuid
UUid的主键 采用String类型主键
数据生成32位字符串
4.2.6 assigned
前五种策略 都是代理主键的生成策略
普通指定
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
适用对象时必须指定主键
联合主键
主键并不是唯一 主键可以有两个列组成 firestname +lastname
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
查看建表语句 有联合主键信息
在<id>元素中通过 <generator class="生成策略"></generator>指定数据表主键生成策略 常用的生成策略有六种
4.2.1 increment
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
原理: select max(id) from customer insert max(id)+1
***使用Increment创建表 没有主键自增长 通过Hibernate在程序中内部完成自增长
***好处是可以跨平台 缺点 高并发访问 可以出现主键的冲突 模仿两个线程同时并发
适用范围
由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
适用于只有单个 Hibernate 应用进程访问同一个数据库的场合
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.2 identity (Mysql)
identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型(加1带走)
原理:依赖数据库内部增长 和Hibernate无关
**创建表 not null auto_increment
**优点无需程序处理 数据库自己完成主键的增长 缺点mysql支持 oracle不支持
***没有线程并发问题
适用范围:
由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型.
支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.3 sequence----Oracle
sequence 标识符生成器利用底层数据库提供的序列来生成标识符
原理:依赖数据库序列的支持 和Hibernate无关
oracle支持序列 mysql不支持序列
序列的原理的:
create sequence customer_sq
insert into customer(id) values(customer_sq.nextval) 序列自动问
适用范围:
适用范围:
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4.2.4 native
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
适用范围:
由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
4,2.5 uuid
UUid的主键 采用String类型主键
数据生成32位字符串
4.2.6 assigned
前五种策略 都是代理主键的生成策略
普通指定
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
适用对象时必须指定主键
联合主键
主键并不是唯一 主键可以有两个列组成 firestname +lastname
Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: com.guigu.model.Person
查看建表语句 有联合主键信息