hibernate主键自动生成
Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int,long不能设置为null,不具备该功能。
<!--以上抄书,待研究论证-->
- <id name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"
- unsaved-value="null|any|none|undefined|id_value"
- access="field|property|ClassName">
- <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
- </id>
<id name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"
unsaved-value="null|any|none|undefined|id_value"
access="field|property|ClassName"> <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
</id>
如果 name属性不存在,会认为这个类没有标识属性
unsaved-value 参考http://blog.csdn.net/chunkyo/article/details/660050
access(可选 - 默认为property): Hibernate用来访问属性值的策略。 (网上查不到什么资料)
generator
1、assigned:
在调用session.save()之前,必须手动setId(主键值),否则出错。
<generator>没有指定时的默认生成策略。
2、increment:自增长,为long, short或者int类型生成主键
自动增长,由hibernate维护,适用于所有的数据库,每次插入数据前先查询最大id(select max(id) from xxx),即使id已经设好值,无视。
缺点:不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
3、identity:自增长
与increment不同的是:
a)identity不是由hibernate控制,而是由数据库控制自增长,所插入数据前不会查询最大id。
b)以Mysql为例,如果主键字段没有开启auto_increment,会抛异常"Field 'id' doesn't have a default value"。
c)increment的insert语句包括id,identity的insert语句没有id字段。
c)假设有五条数据,id分别为1、2、3、4,删除(3、4)后,用increment增加数据id为3,用identity增加数据id为5。
不同的数据库有不同的自增长方式。如MySql是auto_increment,SQL Server 中是Identity。支持的数据库:MySql、SQL Server、DB2、Sybase和HypersonicSQL。
优点: 不需要Hibernate和用户的干涉,使用较为方便。
缺点:但不便于在不同的数据库之间移植程序。
4、sequence:自增长
需要底层数据库支持Sequence方式。
实现了Sequence的数据库:Oracle、DB2、PostgreSQL。
没有实现Sequence的数据库: MySQL、SQL Server、Sybase。
如果在MySql中使用该方式,hibernate会根据Dialect判断报错。
5、hilo:hi/low(高低位)算法,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。
- <generator class="hilo" >
- <param name="table">hi_value</param>
- <param name="column">next_value</param>
- <param name="max_lo">100</param>
- </generator>
<generator class="hilo" >
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
hibernate根据hilo生成器生成主键的过程:
(1)读取并记录数据库的hi_value表中next_value字段的值,数据库中此字段值加1保存
(2)hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)
(3)取得hi值和lo值后,根据下面的公式计算主键值:hi*(max_lo+1)+lo;
过程参考:http://hi.baidu.com/sai5d/blog/item/88e5f4db09e90277d0164e30.html
个人感觉没有自增长好,不仅多维护一个表,每次插入数据都要进行查和修改next_value的值。
6、seqhilo基于sequence的hilo算法。
7、native:
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
疑问:什么时候选择Hilo?
7、uuid:
id必须是String类型。
使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
特点:能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间。
8、guid
使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL。
MySql中,先执行select uuid()。 uuid()是MySql自带的函数,取得uuid值后再生成主键。
9、select:使用数据库触发器赋值 (待研究)
10、foreign:使用外键赋值,在一对一实体关系时,可以保证关系双方的id保持一致。(待研究)
hibernate主键自动生成的更多相关文章
- Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化
有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...
- Entity Framework Code First 遭遇主键自动生成问题
4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...
- SQL Server主键自动生成_表and存储过程
主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...
- MySql主键自动生成,表、实体、C#调用方法
1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...
- Oracle主键自动生成_表and存储过程
-- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...
- Hibernate主键生成策略(转)
1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...
- Java Hibernate 主键生成10大策略
本文将介绍Hibernate中主键生成的几种策略方案,有需要的朋友可以参考一下. 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为lon ...
- [转]hibernate主键生成策略
1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识使用SQL Server 和 MySQL 的 ...
- java框架篇---hibernate主键生成策略
Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
随机推荐
- c 语言简单计算器源码
// main.c // 计算器 // Created by qianfeng on 14-7-15. // Copyright (c) 2014年 ___FGY___. All rights ...
- mybatis获取插入的语句主键(自增主键)
<insert id="insertUser" parameterType="User"> <selectKey keyProperty=&q ...
- 为Firefox 添加自定义搜索引擎
网上流传的 about:config[对于新版已经失效] 以及到Firefox安装目录中修改 的方式不知道为什么我没有成功 现在来个简单点得! 首先我们需要一个可以自定义搜索引擎的插件 Organiz ...
- FormView分页显示数据的例子
%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FormView控件.aspx.cs ...
- 基于Visual C++2013拆解世界五百强面试题--题9-找出所有的排列方式
给出一个函数来输出一个字符串的所有排列 按照排列组合的知识我们知道 N个字符排列组合个数有n!种, 那么可知f(n) = n*f(n-1), 如果{1,2}的组合有两种,12,21, 那么{123}的 ...
- Eclipse RCP扩展
它跟普通的插件扩展点是一样的写法,你只需要看 eclipse 自带的源码,打开你的 eclipse 目录,插件 *.exsd 找到后在 eclipse 中查看这个文件夹对应的插件的源码,里面有 plu ...
- Linux BFS简介
1. 什么是BFS 这里的BFS可不是广度优先算法,本文介绍的BFS是Linux的一个非Linux mainline调度算法.根据作者的描述BFS能够极大的提高低端设备(这里的低端设备的定义为:CPU ...
- US/OS2之任务同步与通信
嵌入式系统中的各个任务都是以并发的方式来运行的,并为同一个大的任务服务,它们不可避免地要共同使用一些共享资源,并且在处理一些需要多个任务共同协作来完成的工作时,还需要相互的支持和限制.因此,对于一个完 ...
- sql日期转换格式
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...
- AS3 Post 参数和ByteArray的方法及服务器端接收
as端: (form表单形式)req.method = URLRequestMethod.POST; var reqHeader:URLRequestHeader = new URLRequestHe ...