首页 > 其他 > 详细

@GenericGenerator和@GeneratedValue的一点理解

时间:2020-11-19 16:50:03      阅读:330      评论:0      收藏:0      [点我收藏+]

@GenericGenerator

GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器由GenericGenerator实现多定义的策略
所以,它要配合GeneratedValue一起使用,GeneratedValue注解中的”generator”属性要与,
GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略

主键生成策略一共有13种
1.GENERATORS.put("uuid", UUIDHexGenerator.class);
采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")

2.GENERATORS.put("hilo", TableHiLoGenerator.class);
hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "hilo")

3.GENERATORS.put("assigned", Assigned.class);
assigned 在插入数据的时候主键由程序处理(很常用),这是<generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

4.GENERATORS.put("identity", IdentityGenerator.class);
identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "identity")

5.GENERATORS.put("select", SelectGenerator.class);
select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name="select", strategy="select",
parameters = { @Parameter(name = "key", value = "idstoerung") })

6.GENERATORS.put("sequence", SequenceGenerator.class);
sequence 调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

7.GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
seqhilo 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",
parameters = { @Parameter(name = "max_lo", value = "5") })

8.GENERATORS.put("increment", IncrementGenerator.class);
increment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "increment")

9.GENERATORS.put("foreign", ForeignGenerator.class);
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @Parameter(name = "property", value = "employee") })

10.GENERATORS.put("guid", GUIDGenerator.class);
guid 采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQL Server的newid()函数,ORCALE的rawtohex(sys_guid())函数等
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "guid")

11.GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
uuid.hex 看uudi,建议用uuid替换
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")

12.GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

13. native
native对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制),native就是将主键的生成工作交给数据库本身,hibernate不管。(很常用)
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "native")

@GeneratedValue

属于一个JPA接口(从JAVA EE 5开始,存在于javax.persistence包下;
GeneratorValue注解----JPA通用策略生成器
其接口下包含了两个抽象的参数:
1.GenerationType类型的strategy
2.String类型的generator,

GenerationType同样也位于javax.persistence包下,并且还继承了Enum枚举类,然后strategy有4个值供我们使用
1.TABLE(table):使用一个特定的数据库表格来保存主键。
2.SEQUENCE(sequence):根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
3.IDENTITY(identity):主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
4.AUTO(auto):主键由程序控制,也是GenerationType的默认值。

其中generator属性的值是一个字符串, 默认为"",其声明了主键生成器的名称(对应于同名的主键生成器

@GenericGenerator和@GeneratedValue的一点理解

原文:https://www.cnblogs.com/chen2/p/14005215.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!