Hibernate学习之主键生成策略

来源:互联网 发布:关于网络直播的看法 编辑:程序博客网 时间:2024/05/15 01:57

hibernate4.1.10中有个hibernate-jpa-2.0-api-1.0.1.Final.jar包,这个包应该是JPA的吧,在使用Hibernate的主键生成策略的时候用到了这个包,而JPA的主键生成策略与Hibernate自己的不一样.

JPA策略:

1.GenerationType.AUTO: JPA自动选择合适的策略,是默认选项;

@GeneratedValue(strategy=GenerationType.AUTO)


2.GenerationType.IDENTITY:表自增键字段,Oracle不支持这种方式;

3.GenerationType.SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;

<pre name="code" class="html">@SequenceGenerator(name = "userSEQ", sequenceName = "csu_user_sequence")   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userSEQ") 


4.GenerationType.TABLE: 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植

@TableGenerator(name = "csdnGenerator", table = "csdn_generator", pkColumnName = "keyName", valueColumnName = "keyValue", pkColumnValue = "teacher", allocationSize = 1)  
@GeneratedValue(strategy = GenerationType.TABLE, generator = "sisTableGen")  

@TableGenerator表示这个表要采用table的id生成方式,括号中的各个参数说明:


(i) name表示生成器的名字,在随后实体的id中要指明.

(ii)table表示在数据库中生成的管理id生成策略的表的名字.

(iii)pkColumnName:主键表中主健名称的列名

(iv)pkColumnValue:主键表中主键名称

(v)valueColumnName:主键表中主键值的列名

(vi)allocationSize表示每次取得一个主键的值之后增长的步长值,这里是每次递增1.


pkColumnNamevalueColumnNamepkColumnValue1下一个ID值pkColumnValue2下一个ID值pkColumnValue3下一个ID值


Hibernate特有策略:13种

1.native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,

hibernate不管(很常用)。

2.uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。

3.hilo: 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)。

4.assigned: 在插入数据的时候主键由用户指定(不由系统创建)处理(很常用),这是 <generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。

5.identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常

用), 等同于JPA中的INDENTITY。

6.select: 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)。

7.sequence: 调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。

8.seqhilo: 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用)

9.increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。

10.foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用。

11.guid: 采用数据库底层的guid算法机制,对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等。

12.uuid.hex: 看uuid,建议用uuid替换。

13.sequence-identity: sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本


自定义主键生成策略,由@GenericGenerator实现。

hibernate在JPA的基础上进行了扩展,可以用一下方式引入hibernate独有的主键生成策略,就是通过@GenericGenerator加入的.


例子1.

不写GenerateValue
等于

@GeneratedValue
等于
@GeneratedValue(strategy=GenerationType.AUTO)
等于(Hibernate策略)

@GeneratedValue(generator="auto")@GenericGenerator(name="auto", strategy="assigned")

例子2:native

    @GeneratedValue(generator = "paymentableGenerator")         @GenericGenerator(name = "paymentableGenerator", strategy = "native")   
例子3:uuid

    @GeneratedValue(generator = "paymentableGenerator")         @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")   
    @GeneratedValue(generator = "paymentableGenerator")         @GenericGenerator(name = "paymentableGenerator", strategy = "uuid/native/hilo/identity/increment/guid/uuid.hex")   
例子4:select

    @GeneratedValue(generator = "paymentableGenerator")       @GenericGenerator(name="select", strategy="select",            parameters = { @Parameter(name = "key", value = "idstoerung") })  

例子5:sequence

    @GeneratedValue(generator = "paymentableGenerator")       @GenericGenerator(name = "paymentableGenerator", strategy = "sequence",                 parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })  

例子6:seqhilo

    @GeneratedValue(generator = "paymentableGenerator")       @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",                 parameters = { @Parameter(name = "max_lo", value = "5") })  

例子7:foreign

    @GeneratedValue(generator = "idGenerator")       @GenericGenerator(name = "idGenerator", strategy = "foreign",                 parameters = { @Parameter(name = "property", value = "employee") })  

例子8:uuid

    @GeneratedValue(generator = "paymentableGenerator")       @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",                 parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })  






0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被风吹的嘴歪了怎么办 怀孕一个多月见红了怎么办 b本扣了6分怎么办 b牌驾驶证扣6分怎么办 忘记了谁考证的密码怎么办 专升本学校有课怎么办 跨境额度超了怎么办 微商代购被骗了怎么办 减肥到了瓶颈期该怎么办 大润发超市把一件商品打两件怎么办 小红书上买到假货怎么办 主动退市股票钱怎么办 老板卷款逃跑财务怎么办 房开延迟交房怎么办 房开逾期交房怎么办 买了保险想退保怎么办 辐射避难所探索废土死了怎么办 大门上边的齿轮滑丝怎么办 国通石油储油卡怎么办 买大棚房受骗了怎么办 朋友做安利天天来我门面怎么办 安利优惠顾客卡怎么办 苹果手机天气温度不显示怎么办? 安利净水器坏了怎么办 安利净水器滤芯盖搭配坏怎么办 安利会员卡过期了怎么办 婴儿吃了润唇膏怎么办? 用错沐浴露洗头怎么办 雅蜜润肤沐浴露怎么办 自煮小火锅水放少了怎么办 安利皇后锅发黑怎么办 宝宝灌肠后不拉屎怎么办 吃蛋白质粉肚子长胖了怎么办 安利产品过期了怎么办 拼多多拼不到人怎么办 被海南大宗骗了怎么办 手机被游戏扣钱怎么办 做酵素剩下的水果怎么办 喝了酵素胃疼怎么办 海科融通不到账怎么办 美团外卖没生意怎么办