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

者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的
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. P4891 序列

    P4891 序列 题目描述 给定两个长度为 n 的序列 A 和 B,定义序列 \(C_i=\max\limits_{j=1}^i A_j\) 定义当前的价值是 $\prod\limits_{i=1}^ ...

  2. Redis 主从 keepalived高可用 实现 VIP 自动漂移

    Redis 多主写多从度 配置启动OK :直接配 keepalived  相关配置: redis 默认路径 :/usr/local/redis keepalived 默认路径 :/etc/keepal ...

  3. JS直接if参数的用法

    经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去.例如下面代码: <body> <input type="text" name=&qu ...

  4. AutoMapper中用户自定义转换

    Custom Type Converters Sometimes, you need to take complete control over the conversion of one type ...

  5. numpy 中 shape_base提供的tile方法

    tile函数 来自于numpy.lib.shape_base 功能:重复某个数组. 比如说tile(A, n), 功能是将数组A重复n次,构成一个新的数组(行数只有1个) 比如说tile(A, n, ...

  6. C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)

    什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...

  7. python内置模块之unittest测试(五)

    系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) python模块分析之logging日志(四) pytho ...

  8. ImageNet Classification with Deep Convolutional Neural Networks(译文)转载

    ImageNet Classification with Deep Convolutional Neural Networks Alex Krizhevsky, Ilya Sutskever, Geo ...

  9. MIPI协议学习总结(一)

    一.MIPI 简介: MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写.MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准. 已经完 ...

  10. 【转】void及void指针的深刻解析

    void的含义 void即“无类型” ,void*则为“无类型指针”,可以指向任何数据类型,所以又叫做“通用指针”. void指针使用规范 ①void指针可以只想任意类型的数据,亦即可用任意数据类型的 ...