hibernate之ID生成策略
来源:互联网 发布:如何选择健身房 知乎 编辑:程序博客网 时间:2024/05/16 06:08
(一)ID生成策略基于xml的配置
在Student.hbm.xml中配置
<id name="propertyName" type="typename" column="column_name" unsaved-value="null|any|none|undefined|id_value" access="field|property|ClassName"> node="element-name|@attribute-name|element/@attribute|." <generator class="属性值"/></id>
可选的<generator>
子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用<param>
元素来传递。
<id name="id" type="long" column="cat_id"> <generator class="org.hibernate.id.TableHiLoGenerator"> <param name="table">uid_table</param> <param name="column">next_hi_value_column</param> </generator></id>
identity(相当于建表时的auto_increment)
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long
, short
或者int
类型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long
, short
或者 int
类型的。
uuid(全球唯一的字符标记)
uses a 128-bit UUID algorithm to generate identifiers of type string that are unique within a network (the IP address is used). The UUID is encoded as a string of 32 hexadecimal digits in length.(主键必须是String类型)
native
identity
, sequence
or hilo
depending upon the capabilities of the underlying database.使用@Id注解可以将实体bean中的某个属性定义为标识符(identifier). 该属性的值可以通过应用自身进行设置, 也可以通过Hiberante生成(推荐). 使用 @GeneratedValue注解可以定义该标识符的生成策略:
- AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.(默认)
- TABLE - 使用表保存id值
- IDENTITY - identity column(只支持mysql,sqlserver)
- SEQUENCE - sequence(oracle)
和EJB3规范相比,Hibernate提供了更多的id生成器.详情请查阅 Hibernate Annotation Extensions .
下面的例子展示了使用SEQ_STORE配置的sequence生成器
通过@SequenceGenerator 和@TableGenerator,你可以配置不同的identifier生成器.
(第一种):使用@SequenceGenerator,可以修改数据库里生成器的名字,使各个生成器的名字不一样。
@Entity@javax.persistence.SequenceGenerator( name="SEQ_STORE",//这是sequenceGenerator的名字 sequenceName="my_sequence" //这是数据库里id生成器的名字(自己单独的生成器名字))public class Store implements Serializable { private Long id; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE") public Long getId() { return id; }}
在这个例子中,Store类使用名为my_sequence的sequence,并且SEQ_STORE 生成器对于其他类是不可见的.
要先指定好生成策略:strategy,再指定生成器的名字generator,在定义生成器的名字时,需要用@sequenceGenerator来指定生成器的名字才可以
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE") //这里的generator对应的是在类上定义的@SequenceGenerator的名字
public Integer getId() { ... }
下面这个例子使用的是identity生成器
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)public Long getId() { ... }
AUTO生成器适用于可移植的应用(在多个DB间切换). 其中:多个@Id可以共享同一个identifier生成器,只要把generator属性设成相同的值就可以了.
@javax.persistence.TableGenerator( name="EMP_GEN", //tableGenerator的名字 table="GENERATOR_TABLE", //数据库中生成表的名字 pkColumnName = "key", //表中第一个字段的名字 valueColumnName = "hi" //表中第二个字段的名字 pkColumnValue="emp", //表中第一个字段的值即表中的一条记录(见名知意):名字可以该类的名字,方便区分 allocationSize=1 //表示步长,每次增加的数值(类似auto_increment))public class Store implements Serializable { private Long id; @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="EMP_GEN") public Long getId() { return id; }}
通过@SequenceGenerator 和@TableGenerator,你可以配置不同的identifier生成器. 每一个identifier生成器都有自己的适用范围,可以是应用级(application level)和类一级(class level).
(一)类一级的生成器在外部是不可见的, 而且类一级的生成器可以覆盖应用级的生成器.
下面这个例子展示了:定义在类范围(class scope)的sequence生成器:(常用方法)
@Entity@javax.persistence.SequenceGenerator( name="SEQ_STORE",//这是sequenceGenerator的名字 sequenceName="my_sequence" //这是数据库里id生成器的名字(这样可以更改数据库生成器的名字))public class Store implements Serializable { private Long id; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE") public Long getId() { return id; }}
在这个例子中,Store类使用名为my_sequence的sequence,并且SEQ_STORE 生成器对于其他类是不可见的.
(二)应用级的生成器则定义在包一级(package level)(如package-info.java):
@javax.persistence.TableGenerator( name="EMP_GEN", table="GENERATOR_TABLE", pkColumnName = "key", valueColumnName = "hi" pkColumnValue="EMP", allocationSize=20)@javax.persistence.SequenceGenerator( name="SEQ_GEN", sequenceName="my_sequence")package org.hibernate.test.metadata;
如果在org.hibernate.test.metadata包下面的 package-info.java文件用于初始化EJB配置, 那么该文件中定义的 EMP_GEN 和SEQ_GEN都是应用级的生成器. EMP_GEN定义了一个使用hilo算法 (max_lo为20)的id生成器(该生成器将id的信息存在数据库的某个表中.). id的hi值保存在GENERATOR_TABLE中. 在该表中 pkColumnName"key"等价于 pkColumnValue "EMP", 而valueColumnName "hi"中存储的是下一个要使用的最大值.
SEQ_GEN则定义了一个sequence 生成器, 其对应的sequence名为 my_sequence. 注意目前Hibernate Annotations还不支持sequence 生成器中的 initialValue和 allocationSize参数.
- hibernate之ID生成策略
- Hibernate之ID主键生成策略
- Hibernate进阶之ID主键生成策略
- Hibernate系列之Id生成策略
- Hibernate ID 生成策略
- hibernate id 生成策略
- hibernate ID生成策略
- Hibernate ID 生成策略
- Hibernate id生成策略
- hibernate---ID生成策略
- hibernate id生成策略
- hibernate id 生成策略
- hibernate--ID生成策略
- Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略
- Hibernate的ID生成策略
- hibernate的ID生成策略
- Hibernate + Oracle id 生成策略
- hibernate id设置生成策略
- python数字图像处理(17):边缘与轮廓
- js 数组随机排序
- 分类模型的评价
- 图形绘制: Canvas、SurfaceView、Paint、Surface、SurfaceHolder、Bitmap
- chmod命令简介
- hibernate之ID生成策略
- C# WPF MVVM 实战 – 5- 用绑定,通过 VM 设置 View 的控件焦点
- JAVA web 文件下载时 文件头设置
- 查找sqlserver查询死锁源头的方法 sqlserver死锁监控
- Zstack协议栈--系统时钟定时器
- HTTP协议
- HDU 1317(spfa找环)
- 数据库连接池的原理
- 自定义添加字体