`
schy_hqh
  • 浏览: 555843 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate基于配置文件(五)ID生成策略及其对效率的影响

 
阅读更多

实体类的ID生成策略

 



主键选用原则--无意义字段/非业务
主键不能修改
主键是程序实现上利用的,与客户的实际业务无关---逻辑主键,没有业务上的意义
因为主键与业务无关,也就防止了被修改的可能性
id生成策略---解决了id生成的方式--由hibernate来完成,程序员不需要考虑,完全由hibernate进行管理
<id name="id">
            <generator class="native"/>
</id>

在调用save()将对象变为持久化对象的时候,hibernate将利用id生成策略算法来对对象进行id赋值
因为,持久化对象必具有唯一的id标识值

项目中常用的生成策略:


native --依赖于数据库底层,适用范围 short int long---不同表的id都为1开始,由hibernate根据数据库类型自动选择策略,如果是mysql,则identity,如果是oracle,则sequence,否则hilo策略。

             mysql : identity  

             oracle: sequence
             hilo  --依赖于数据库底层,适用范围 short int long ---一个数据库下的id不会重复

uuid  字符串id --不依赖于数据库底层,在内存中生成,整个网络中id标识符唯一

 

foreign  一对一外键关联时,用关联表的id值作为本表的id值

assign 程序员手动给id赋值


save()是否立即发出insert语句,取决于id值的生成是否依赖数据库底层
identity与sequence策略

id从1开始,依次递增,依赖数据库底层来生成id

必须先insert才会有id值,所以在save()被调用时,会立即发出insert语句

因为需要数据库底层来生成id,在生成id之后,hibernate会更新内存中的id值;

hilo与uuid策略

id值不是递增的,不依赖/不完全依赖数据库底层生成id

在save()被调用时,不会立即发出insert语句,等到commit()时才发出insert语句。

(hilo采用高低位算法生成id值,在内存中会生成一个值,再在数据库中生成一个值,这个值基于数据库中的其它表来生成,所以不需要立即插入到表中;uuid在内存中即可生成)

因为id值由hibernate在内存中自动生成,会在commit()被调用后,才会发出insert语句。

 

 

批量插入数据时,如果使用native策略,将非常的低效:

每次save()都必须先发insert语句,无法利用JDBC的批处理功能!

解决方案:

1.使用assign策略,手动指定id(先查询当前表的id值,得出下一个id值,这样就实现id连续了)

2.每次save()调用200次,flush(),批量将这200条插入到数据库中

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics