*****hibernate主键生成
一、主键
主键是关系数据库中的一个基本概念,它用来保证记录的唯一性主键都是没有业务含义的,所以开发
者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的
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主键生成的更多相关文章
- hibernate主键生成机制与save返回
主键生成机制为assigned时,save之后通过get得不到id(主键),使用identity可以. hibernate主键生成机制1) assigned主键由外部程序负责生成,无需Hibernat ...
- java框架篇---hibernate主键生成策略
Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
- 基于按annotation的hibernate主键生成策略
基于按annotation的hibernate主键生成策略 博客分类: Hibernate HibernateJavaJPAOracleMySQL 这里讨论代理主键,业务主键(比如说复合键等)这里不 ...
- 160727、自定义hibernate主键生成策略生成字符串+数字自增长
需求:需要自增长注解如MyId0001.MyId0002.MyId0003 实现:实现这个接口org.hibernate.id.IdentifierGenerator 一.MyIdGenerator. ...
- jpa基于按annotation的hibernate主键生成策略
JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hib ...
- hibernate主键生成策略
在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下: 1.increment 主键按照数值顺序递增,使用当前实例中最大值 ...
- Hibernate主键生成策略(转)
1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...
- hibernate主键生成策略(转载)
http://www.cnblogs.com/kakafra/archive/2012/09/16/2687569.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指 ...
- 初学Hibernate主键生成策略
具有业务含义的主键叫自然主键:随机生成,不具备业务含义的字段作为主键,叫代理主键. 在表与POJO类关系映射文件XXX.hbm.xml中,可通过配置id元素下generator节点的class属性指定 ...
- Java Hibernate 主键生成10大策略
本文将介绍Hibernate中主键生成的几种策略方案,有需要的朋友可以参考一下. 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为lon ...
随机推荐
- vue切换路由页面内容没有重载
项目中遇到这样一个问题: 在一个地方填了一个申请的表单,需要在另一个页面的列表上显示出来这条申请的数据,但是由于vue的缓存,在切换路由时列表上并没有及时更新数据,解决方法如下: vue路由切换时页面 ...
- JAVA记录-基础常识
1.==与equals区别 1)==用于基本数据类型的比较,判断引用是否指向堆内存的同一地址.---引用地址 2)equals用于判断两个变量是否是对同一对象的引用,即堆中的内容是否相同,返回值为布尔 ...
- .Net进阶系列(4)-Lambda和linq入门(被替换)
一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...
- oozie JAVA Client 编程提交作业
1,eclipse环境搭建 在eclipse中新建一个JAVA工程,导入必要的依赖包,目前用到的有: 其次编写JAVA 程序提交Oozie作业,这里可参考:oozie官方参考文档 在运行提交程序前,首 ...
- This dependency was not found: * !!vue-style-loader!css-loader?
npm install stylus-loader css-loader style-loader --save-dev 猜测这两个组件发布时是不需要的,所以要加上-dev
- Python分析网页中的<a>标签
soup = BeautifulSoup(html,"html.parser") html=soup.select("table a") for k in ht ...
- PHP 将amr音频文件转换为mp3格式
说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3.在网页端使用HTML5的audio标签来 ...
- MySQL指令
在mysql里:文件夹就是数据库 文件就是表 创建用户: 格式:create user '用户名'@'IP地址' identified by '密码'; 说明:IP地址是用来限制用户只能在哪 ...
- Elastic Job入门(1) - 简介
介绍 构建一般的业务系统来说,使用Quartz或者Spring Task即可基本满足我们的单体服用应用需要.然而随着线上业务量的不断发展,这两种定时任务已经日渐无法满足我们的需求.一般,使用这两种定时 ...
- django(二)中间件与面向切面编程
一.中间件概念 django 自带函数可以在几个环节调节收到请求.处理请求.处理异常.以及发送请求. 看这里给的链接好了,这是一个大佬的讲django中间件的博客,非常清楚:https://www.c ...