Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int,long不能设置为null,不具备该功能。
<!--以上抄书,待研究论证-->

  1. <id  name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"
  2. unsaved-value="null|any|none|undefined|id_value"
  3. access="field|property|ClassName">
  4. <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
  5. </id>
  1. <id name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"
  2. unsaved-value="null|any|none|undefined|id_value"
  3. access="field|property|ClassName">
  4.  
  5. <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
  6. </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必须有一条记录否则会出现错误。

  1. <generator class="hilo" >
  2. <param name="table">hi_value</param>
  3. <param name="column">next_value</param>
  4. <param name="max_lo">100</param>
  5. </generator>
  1. <generator class="hilo" >
  2. <param name="table">hi_value</param>
  3. <param name="column">next_value</param>
  4. <param name="max_lo">100</param>
  5. </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主键自动生成的更多相关文章

  1. Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化

    有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...

  2. Entity Framework Code First 遭遇主键自动生成问题

    4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...

  3. SQL Server主键自动生成_表and存储过程

    主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...

  4. MySql主键自动生成,表、实体、C#调用方法

    1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...

  5. Oracle主键自动生成_表and存储过程

    -- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...

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

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

  7. Java Hibernate 主键生成10大策略

    本文将介绍Hibernate中主键生成的几种策略方案,有需要的朋友可以参考一下. 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为lon ...

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

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

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

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

随机推荐

  1. MVC-05 Model(1)

    在开发应用程序的过程中,经常需要处理许多大大小小的数据,例如,SQL Server数据库存取.连接AD(Active Directory)数据库进行验证.调用外部Web Service取得数据等.除了 ...

  2. Splunk

    http://www.huxiu.com/article/33724/1.html http://www.netis.com.cn/splunk/%E4%BB%80%E4%B9%88%E6%98%AF ...

  3. 如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

     如果某企业在 Windows Azure 上托管某个应用程序,该应用程序会在某个特定时间暴露到 Internet,以用于商业用途.公共 Internet 带来 客户的同时也带来了攻击者. Tim ...

  4. HDU 1286 找新朋友

    题解:分析题目,就是一个裸的欧拉函数,于是AC. #include <cstdio> int eular(int n){ int ret=1,i; for(i=2;i*i<=n;i+ ...

  5. java循环HashMap两种方法的效率比较

    一.循环HashMap的两种方式 方式1: Iterator<Entry<String, String>> entryKeyIterator = entrySetMap.ent ...

  6. hdoj 5249 KPI(treap)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5249 思路分析:使用queue记录管道中的值并使用treap能够查询第K大的功能查询第floor(m/ ...

  7. grunt用来压缩前端脚本

    grunt作为一个任务管理工具,提供丰富的插件和强大的自动化管理功能.需要安装node及npm. 主要使用到两个文件,一个是npm的依赖配置文件package.json { "name&qu ...

  8. JAVA ThreadPoolExecutor(转)

    原文链接:http://blog.csdn.net/historyasamirror/article/details/5961368 基础 在我看来,java比C++的一个大好处就是提供了对多线程的支 ...

  9. CodeForces 150B- Quantity of Strings 推算..

    假设 k = 5 , n>k ,   (1,2,3,4,5)  -> 1=5,2=4,3任意 (2,3,4,5,6) -> 2=6,3=5,4任意...综合上面的可得出1=3=5,2 ...

  10. 高性能网站优化-创建快速响应的Web

    <高性能网站建设进阶指南> 优化原则 优化的目的是希望降低程序的整体开销. 减少开销 通常认为开销就是程序的执行时间.而在进行优化工作时,应该把重点放在对程序开销影响最大的那部分. 假设我 ...