一、主键
主键是关系数据库中的一个基本概念,它用来保证记录的唯一性主键都是没有业务含义的,所以开发

者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的
Hibernate内置了两类策略:
一类是JPA标准的主键生成策略,一类是Hibernate框架特有的主键生成策略。
JPA标准策略有4种:

1.auto策略(JPA默认的策略)如:
public class Teacher
{
private int id;
private String title;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId()
{
return id;
}
}
我使用的
2.table策略(保存插入记录的时,需要的主键值)如:
public class Teacher
{
private int id;
private String title;

@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator="myTableGenerator")
@TableGenerator(name = "myTableGenerator", table = "hibernateNeedTable",
pkColumnName = "pk_key", valueColumnName = "pk_value", pkColumnValue =

"teacherId",
initialValue = 100, allocationSize = 1000)
public int getId()
{
return id;
}
}
3.sequence策略(为了使用序列)如:
public class Teacher
{
private int id;
private String title;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="mySeqGenerator")
@SequenceGenerator(name = "mySeqGenerator", sequenceName = "t_teacher_sequence",

initialValue = 1000, allocationSize = 50)
public int getId()
{
return id;
}
}
这里需要配合使用@SequenceGenerator,用来指定序列的相关信息。
name:序列生成器的名称,会在@GeneratedValue中进行引用

sequenceName:oracle数据库中的序列生成器名称

initialValue:主键的初始值

allocationSize:主键每次增长值的大小
注意:如果底层数据库不执行序列,会报错:

org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support

sequences

4.identity策略(提供了对自增主键的支持)如:
public class Teacher
{
private int id;
private String title;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId()
{
return id;
}
}

二、总结

hibernate中一个数据模型的主键常用有三种形式:uuid、native、assigned,分别是通用唯一标识、自

增、自定义。
1、uuid是系统产生的,insert数据库时相比native要快很多,但是uuid是一长串无序字符串,理论上讲

查找起来会慢一点,但是不太会影响开发的。uuid即通用唯一标识,在不知道怎么定义主键时,它是不二的选择;
1.1、生成简单,java中已经有现成的东西,引入java.util.UUID,
1.2、通用唯一,其实可以加上全球,uuid的生成原理:
当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,

则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没

有网卡以其他方式获得);
1.3、在任何时候两个相同数据表的数据放在一起不会出现主键冲突,这在实际开发中会带来很大的好处。
2、而native是数据库生成,在insert时会先计算所以会比uuid慢一点,但是在查找和删除数据时,会比较方便。
3、uuid和assigned的生成是在程序中完成的,一个是自动,一个是手动。所以在进行session.save()

时,不会产生sql语句,数据库中也不会有数据。而native需要读取数据库数据才能完成自动递增,所以

在执行session.save()时,就会产生相应的sql语句,数据库中就会有数据。

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

  1. hibernate主键生成机制与save返回

    主键生成机制为assigned时,save之后通过get得不到id(主键),使用identity可以. hibernate主键生成机制1) assigned主键由外部程序负责生成,无需Hibernat ...

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

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

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

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

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

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

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

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

  6. hibernate主键生成策略

    在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下: 1.increment 主键按照数值顺序递增,使用当前实例中最大值 ...

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

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

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

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

  9. 初学Hibernate主键生成策略

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

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

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

随机推荐

  1. golang 的时间格式化操作

    怎么做 简而言之 time.Now().Format("2006-01-02 15:04:05") 你将会获得如同 yyyy-MM-dd hh-mm-ss 这样的输出. 还可以 在 ...

  2. jquery :checked(过滤选择器) 和 空格:checked(后代选择器)【转】

    jquery 过滤选择器 和 后代选择器 <%@ page language="java" contentType="text/html; charset=UTF- ...

  3. POJ No.3255 Roadblocks 求次短路径

    #define _CRT_SECURE_NO_WARNINGS /* 7 10 0 1 5 0 2 2 1 2 4 1 3 2 2 3 6 2 4 10 3 5 1 4 5 3 4 6 5 5 6 9 ...

  4. ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展

    ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类 ...

  5. 尚硅谷spring_boot课堂笔记

    尚硅谷spring_boot课堂笔记

  6. u-boot移植(九)---代码修改---NAND

    一.NAND原理 NAND 无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线. 不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K + 64  个byt ...

  7. luogu P2511 [HAOI2008]木棍分割

    传送门 第一问是一道经典的二分,二分答案\(ans\),然后从前往后扫,判断要分成几段救星了 第二问设\(f_{i,j}\)表示前\(i\)个数分成\(j\)段,每段之和不超过第一问答案的方案,转移就 ...

  8. Django搭建简易博客教程(四)-Models

    原文链接: http://www.jianshu.com/p/dbc4193b4f95 Django Model 每一个Django Model都继承自django.db.models.Model 在 ...

  9. Django学习手册 - 模板继承与导入

    核心: PS:一个页面只能继承一个模板. 前置: 配置url. 配置views 关键字: 1. {% extends "index模板.html" %} 声明继承于哪个模板 ,关联 ...

  10. android彻底关闭应用程序方法

    Android SDK > 7(Android2.1)之后,即Android2.2及以后版本彻底关闭应用的方法,目前试验只有一下方法有效: Intent startMain = new Inte ...