Skip to content

十种主键类型

Yong Zhu edited this page Jan 20, 2018 · 7 revisions

jDialects支持的十种主键类型

主键的生成方式有各种类型,以下为jDialects支持的十种主键类型配置,并为每种配置提供了主键生成器可以直接在程序中调用:

UUID36

用@UUID36注解标注在字段上,与其等效的Java配置方法是uuid36()。
这个标记对DDL生成没有影响,但是在创建虚拟表模型(TableModel)实例时, 会给虚拟列(ColumnModel) 上赋予一个ID生成器,建立在jDialects基础上的ORM工具可以用someDialect.getNexID(col.getIdGenerator(), jdbc, col.getColumnType())方法来获取一个长度为36个字符长的ID, 其格式示例为"d3ad36c0-c6c2-495c-a414-b9cc4a0a7a93"。
UUID36采用Base16编码。 注:getNexID方法的第一个参数为当前虚拟列模型(ColumnModel)的ID生成器,第二个参数为实现了NormalJdbcTool接口的工具类实例,由ORM工具实现,第三个参数为虚拟列模型的数据类型DataType。

UUID32

用@UUID32注解标注在字段上,与其等效的Java配置方法是uuid32()。
这个标记对DDL生成没有影响,但是ORM工具可以用dialect.getNexID(参数略,下同)方法来获取一个长度为32个字符长的ID,其格式示例为"bca5414e9b1b4bdfa257125e05428b92"。
UUID32采用Base16编码,与UUID36的区别是少了中间的横线字符。

UUID25

用@UUID25注解标注在字段上,与其等效的Java配置方法是uuid25()。
这个标记对DDL生成没有影响,但是ORM工具可以用dialect.getNexID方法来获取一个长度为25个字符长的ID,其格式示例为"pbicz3grgu0zk3ipe1yur03h7"。
UUID25采用Base36编码。

UUIDAny

用@UUIDAny注解在类和字段上面,与其等效的Java配置方法是uuidAny()方法。
标记一个任意长度的UUID字段,例如指定长度为50的随机字符串:@UUIDAny(name="uuid50", length=50),或columnModel.uuidAny("uuid50", 50)。
UUIDAny可以标记在类和字段上面,如果标记在类上,在需要定义的字段上需要用名称来引用它:@GeneratedValue(strategy = GenerationType.UUIDAny, generator = "uuid50") 或 tableModel.column("someField").idGenerator("uuid50");
这个标记对DDL生成没有影响,但是ORM工具可以用dialect.getNexID方法来获取指定任意长度的随机字符串。
UUIDAny采用Base36编码。

Identity

Identity类型主键,仅当数据库支持Identity类型的字段时才可以使用,否则在生成DDL时将抛出DialectException异常。 用@IdentityId注解来标注,与其等效的Java配置方法是identityId()。
这个标记在DDL生成时会将数据表字段定义为一个identity类型, ORM工具可以用dialect.getNexID方法来获取由数据库最后一次自动生成的Identity值。

Sequence

Sequence类型主键,仅当数据库支持Sequence类型时才可以使用,否则在生成DDL时将抛出DialectException异常。
用@SequenceGenerator注解标在类和字段上面,与其等效的Java配置方法是sequenceGenerator()方法。
以下为Sequence类型分别用注解和Java方式标记示例:

@SequenceGenerator(name = "seqID1", sequenceName = "seqName1", initialValue = 1, allocationSize = 10) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqID1") 
public String someField;
或
tableModel.sequenceGenerator("seqID1", "seqseqName11", 1, 10);
tableModel.column("someField").LONG().idGenerator("seqID1");

各参数的定义与JPA中的Sequence注解相同。ORM工具可以用dialect.getNexID方法来获取一个Sequence类型的主键值。

Table

Table类型主键,用一个单独的表格来生成主键,这是JPA推荐的主键生成方式,通用性好。
用@TableGenerator注解标在类和字段上面,与其等效的Java配置方法是tableGenerator()方法。
以下为Table类型主键分别用注解和Java方式标记示例:

@TableGenerator(name = "t1", table = "tb1", pkColumnName = "pkCol1", valueColumnName = "vcol1", pkColumnValue = "pkval", initialValue = 2, allocationSize = 20)
@GeneratedValue(strategy = GenerationType.Table, generator = "t1") 
public String someField;
或
tableModel.tableGenerator("t1", "tb1", "pkCol1", "vcol1", "pkval", 2, 20);
tableModel.column("someField").LONG().idGenerator("t1");

各参数的定义与JPA中的TableGenerator注解相同。ORM工具可以用dialect.getNexID方法来获取一个Table表生成的主键值。

Auto

Auto类型,由ORM工具来决定采用何种方式来生成主键,可能是Table、Sequence、Identity之一。
用@AutoId注解来标注在字段上,与其等效的Java配置方法是autoId()。
这个标记在DDL生成时,如果数据库方言支持Sequence, 会创建一个名为"jdia_seq_autoid"的序列,用于生成ID。 如果数据库不支持Sequence, 会创建一个名为"jdia_table_autoid"的表格,用来生成ID。
ORM工具可以用dialect.getNexID方法来获取由数据库自动生成的ID值。

TimeStampId

采用本机当前时间毫秒数x1000000再加上一个递增值的Long类型作为主键,适用于对主键要求比较简单的场合。
用@TimeStampId注解来标注在字段上,与其等效的Java配置方法是timeStampId()。
这个标记对DDL生成没有影响,但是ORM工具可以用dialect.getNexID方法来获取这个Long类型的主键值。

SortedUUID

这种主键策略可以生成类似如下格式的主键, 即由一个1开头且递增的数字打头,后面跟一串随机字符: 10001nmpqhegly8eozssq2p1b
10002dligkilfiskjf23klsdf
10003lvbifi35dfjia31kdsfg
因为这种主键生成方式比较少用,只有Java配置方式,没有注解,用法示例如下:

tableModel.sortedUUIDGenerator("sortedId1", 5, 20); 
table.column("id").STRING(20).pkey().idGenerator("sortedId1");

sortedUUIDGenerator方法的第一个参数为主键生成器名,第二个参数为递增数字的位数,第三个参数为随机字符的位数,随机字符采用Base36编码。
这个Java主键生成策略内部引用了Auto主键生成策略,将视数据库是否支持Sequence而生成不同的DDL。ORM工具可以用dialect.getNexID方法来获取生成的主键值。

默认ID生成策略

当一个列被标记为主键,但是没有为它标记任何主键生成策略时,jDialect不做任何事,即假定被标为主键的列的值由外部程序来赋值。

Clone this wiki locally