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

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

    问题 激活 webstorm 2018 最新版 解决步骤 License server:http://im.js.cn:8888

  2. WebApi中的参数传递

    在WebApi开发过程中,遇到一些客户端参数格式传输错误,经常被问到参数如何传递的一些问题,因此就用这篇博客做一下总结,肯定其它地方呢也有类似的一些文章,但是我还是喜欢通过这种方式将自己的理解记录下来 ...

  3. HDU - 4333 Revolving Digits(扩展KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...

  4. UESTC - 1172 三句话题意

    题目链接 记一个集合的gcd为该集合内所有数的最大公约数, 求一个给定集合的非空子集的gcd的k次方的期望~ Input 第一行有一个数t,表示数据组数 接下去每组数据两行,第一行两个数n,k(0 & ...

  5. bzoj千题计划306:bzoj2342: [Shoi2011]双倍回文 (回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2342 解法一: 对原串构建回文自动机 抽离fail树,从根开始dfs 设len[x]表示节点x表示 ...

  6. Java内存泄露处理

    https://www.cnblogs.com/likeli/p/9413830.html

  7. 虚拟机centos7系统下安装hadoop ha和yarn ha(详细)

    一:基础环境准备 (一):虚拟机新建五个centos7系统(复制文件夹的方式) (二):角色分配 (三)按照角色分配表配置 (1)更改主机ip(自行查找),如果只是个人搭建玩一玩,可选择安装cento ...

  8. FCN 32分析:

    FCN 32s

  9. Postfix 邮件服务 - roundcube webmail

      roundcubemail作为web端的邮件客户端.是一个基于浏览器,支持多国语言的IMAP客户端,它的操作界面看起像一个桌面应用程序.它提供一个email客户端应该具备的所有功能,包括MIME支 ...

  10. 为什么还原innobackupex备份后查看到的Executed_Gtid_Set与xtrabackup_binlog_info不一致

    基本环境:官方社区版MySQL 5.7.19,innobackupex version 2.4.8 一.什么不一致 1.1.不一致 首先使用下面脚本来构建Executed_Gtid_Set与xtrab ...