在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下:

1.increment

主键按照数值顺序递增,使用当前实例中最大值加1作为主键。很明显,在生成主键的过程中要对表进行一次遍历,查询出最大的值

之后才能生成主键,同时,因为要比较出最大的值,因此在<id></id>中的type数据类型必须为数值型,否则会产生异常。

注:即使在程序代码中设置了主键,hibernate也会按照主键最大值加1的方法生成主键,而不会使用代码中设置的主键。

采用increment后控制台打印出:

同时表中的数据也发生了变化:

从截图中可以看出increment的实现原理,先在表中查询最大主键值,然后加1生成新主键,这种方式很明显不适用于数据量较大的项目。

2.assigned

使用这种方法,主键要提前设置,hibernate不干预。在   save()   之前指定一个主键(也就是自行设置主键,例如注册账户)。

3.identity

利用数据库提供的主键生成机制,例如MySQL,sqlserver中的自动增长生成主键。如果在建表的时候没有设置主键自增长就会报错。

修改表属性就好了。(varchar数据类型不支持自增长)

4.native

hibernate会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

(注:前提是数据库表中设置了主键自增,否则插入数据不成功;同时也要求主键数据类型为数值型)

5.sequence

采用数据库提供的sequence机制生成主键,Oracle中使用sequence(mysql不支持)

http://www.cnblogs.com/yjmyzz/archive/2012/12/27/2835095.html

6.uuid

由hibernate基于128位唯一值算法,根据当前IP,时间,jvm启动时间,内部自增量产生等多个参数生成16进制数值

(编码后以长度为32的字符串表示)作为主键。在一定程度上保持了产生ID的唯一性。

因为是用长度为32的字符串表示,因此在配置文件中和JavaBean中ID对应的属性应为String类型。

hibernate主键生成策略的更多相关文章

  1. java框架篇---hibernate主键生成策略

    Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...

  2. 基于按annotation的hibernate主键生成策略

    基于按annotation的hibernate主键生成策略 博客分类: Hibernate HibernateJavaJPAOracleMySQL  这里讨论代理主键,业务主键(比如说复合键等)这里不 ...

  3. 160727、自定义hibernate主键生成策略生成字符串+数字自增长

    需求:需要自增长注解如MyId0001.MyId0002.MyId0003 实现:实现这个接口org.hibernate.id.IdentifierGenerator 一.MyIdGenerator. ...

  4. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hib ...

  5. Hibernate主键生成策略(转)

    1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...

  6. hibernate主键生成策略(转载)

    http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...

  7. 初学Hibernate主键生成策略

    具有业务含义的主键叫自然主键:随机生成,不具备业务含义的字段作为主键,叫代理主键. 在表与POJO类关系映射文件XXX.hbm.xml中,可通过配置id元素下generator节点的class属性指定 ...

  8. [转]hibernate主键生成策略

    1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识使用SQL Server 和 MySQL 的 ...

  9. Hibernate主键生成策略及选择

    1 .increment:适用于short,int,long作为主键,不是使用数据库自动增长机制 这是hibernate中提供的一种增长机制 在程序运行时,先进行查询:select max(id) f ...

随机推荐

  1. ThinkPHP 整合Bootstrap Ajax分页

    ThinkPHP Ajax分页代码 publicfunction index() { $where=array(); $name = I('name'); if(!empty($name)){ $wh ...

  2. Autodesk 为其云技术发布新品牌- Autodesk Forge

    近些年来Autodesk陆续发布了不少云解决方案和服务,比如BIM 360, Infraworks 360,Autodesk 360/A360, AutoCAD 360等等,这些众多叫做360的产品或 ...

  3. Android View的滑动 动画

    [scrollTo/scrollBy] //控件内的文字会移动,但是控件本身不会移动,而且移动到控件之外之后,文字也就看不见了 if(v.equals(button2)){ button2.scrol ...

  4. 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    新服务器安装完开发环境后,还需要注册framework4.0到IIS.不然会报错:   HTTP 错误 500.21 - Internal Server Error 处理程序“Extensionles ...

  5. C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

    原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...

  6. solr定时更新索引遇到的问题(SolrDataImportProperties Error loading DataImportScheduler properties java.lang.NullPointerException)

    问题描述 报如下错误,很显然,问题原因:空指针异常: ERROR (localhost-startStop-1) [   ] o.a.s.h.d.s.SolrDataImportProperties ...

  7. [Erlang 0123] Erlang EPMD

     epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢?   epmd 是Erlan ...

  8. 幼儿园的 selenium

    from selenium import webdriver     *固定开头     b=webdriver.Firefox()              *打开火狐浏览器    browser. ...

  9. 理解Docker(7):Docker 存储 - AUFS

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  10. Java To CSharp源代码转换

    前言 开发环境 客户端:Unity3D开发(C#) 服务器:Java (基于Java7) 日   期:2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服务器的部分 ...