hibernate主键生成策略

Hibernate主键生成策略

首先要搞清楚的东西:hibernate 和 JPA

Hibernate是一种ORM框架,底层也是用JDBC实现,它主要是帮助我们封装了JDBC的一些重复代码,避免了繁琐性,同时hibernate也有很好的跨数据库平台的优点。而它实现的规范就是JPA(JPA就是sun公司针对ORM技术提出的规范,hibernate实现了这种规范,但也扩展了一些东西)。hibernate内置了许多主键生成策略,一部分是JPA的,一部分是hibernate后来加上的.

JPA的四种主键策略

auto策略(JPA默认的策略)
@Id

@GeneratedValue(strategy = GenerationType.AUTO)

使用auto策略,持久化引擎会从JPA其他的三种策略(identity,table,sequence)中选择最合适的策略(一般mysql:identity,Oracle:sequence)
如果是mysql数据库一定要在mysql数据库相应的表中设置主键列为自增长的,否则会org.hibernate.exception.GenericJDBCException: Field 'id' doesn't have a default value 异常
identity策略(一定要在mysql数据库相应的表中设置主键列为自增长的)

hibernate发送的sql语句

	@Id
	@GeneratedValue(generator="myGenerator")
	@GenericGenerator(name="myGenerator", strategy="auto")
	@Column(name="id",nullable=false)
sequence策略:
如果底层数据库不支持序列(比如用在mysql中),则会抛出以下异常(sequence用于oracle数据库中):
Caused by: org.hibernate.MappingException: Dialect does not support sequences
	@Id
	@GeneratedValue(generator="myGenerator")
	@GenericGenerator(name="myGenerator", strategy="sequence")
	@Column(name="id",nullable=false)
name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。 
sequenceName属性表示生成策略用到的数据库序列名称。 
initialValue表示主键初识值,默认为0。 
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1


table策略:
<span style="font-size:12px;">	@GeneratedValue(generator="myGenerator")
	@TableGenerator(name="myGenerator", table="newcapec", pkColumnName="Type", 
	valueColumnName="Value",pkColumnValue="user", allocationSize=1)</span>

系统中有个表叫"newcapec",它有两个列Type(主键)和Value(值)。每生成一个Student记录,这个Student的id就从newcapec表中取。取Type=user的Value。取过之后,

这个Value会加1,等着下次来取

hibernate主键策略:
assigned:
在没有指定<generator>标签时,默认就是assigned主键的生成方式,在插入数据的时候主键由用户自己添加,hibernate也不管,不建议使用。
native:
	@Id
	@GeneratedValue(generator="myGenerator")
	@GenericGenerator(name="myGenerator", strategy="native")
	@Column(name="id",nullable=false)
native策略会根据底层数据库的能力,从identity、sequence、hilo中选择一个, 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)
uuid:
用于标识字符串类型的列

hibernate发出的语句

increment
这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于Hibernate生成的,所以只能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法.
hibernate发送的sql语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值