在写项目时为数据库主键为varChar的主键配置时发现@GeneratedValue这个注解的配置完成不了MySQL数据库主键的序列化生成策略,所以去看了看这方便的资料发现还说的挺多的.
@GeneratedValue注解:
属于一个JPA接口(从JAVA EE 5开始,存在于javax.persistence包下),其接口下包含了两个抽象的参数,GenerationType类型的strategy和String类型的generator,并且两个参数都有相应的默认值。
其中stratgy属性的默认值有:
GenerationType是一个enum类
GeneratorType strategy
strategy
是 GenerationType
类型的枚举值,它的内容将指定 OpenJPA 容器自动生成实体标识的方式。strategy
属性可以是下列枚举值:
GeneratorType.AUTO
表示实体标识由 OpenJPA 容器自动生成,这也是 Strategy 属性的默认值。
GenerationType.IDENTITY
OpenJPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对自增长字段的支持,常用的数据库中,HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持。
GenerationType.SEQUENCE
表示使用数据库的序列号为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对序列号的支持,常用的数据库中,Oracle、PostgreSQL 等数据库都能够提供这种支持。
GenerationType.TABLE
表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋唯一值,作为实体的标识。
格式:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
/** 类目id */
private Integer categoryId;
generator属性:
String generator
generator
属性中定义实体标识生成器的名称。如果实体的标识自动生成策略不是GenerationType.AUTO
或者GenerationType.IDENTITY
,就需要提供相应的 @SequenceGenerator
或者 @TableGenerator
注释还有@GenericGenerator注解,然后将generator
属性值设置为注释的name
属性值。-
@javax.persistence.SequenceGenerator
如果实体标识的自动生策略是
GenerationType.SEQUENCE
,开发者需要为实体标识字段提供SequenceGenerator
注释,它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性:
表 1. SequenceGenerator 注释属性说明属性 说明 name
该属性是必须设置的属性,它表示了 SequenceGenerator
注释在 OpenJPA 容器中的唯一名称,将会被GeneratedValue
注释的generator
属性使用。将实体标识的自动生成委托给数据库的序列号特性时,实体标识字段的GeneratedValue
注释的generator
属性的值必须和某个SequenceGenerator
注释的name
属性值保持一致。sequenceName
实体标识所使用的数据库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框架将自动创建名为 OPENJPA_SEQUENCE
的序列号。如果一个 OpenJPA 容器中管理的多个实体都选择使用序列号机制生成实体标识,而且实体类中都没有指定标识字段的sequenceName
属性,那么这些实体将会共享系统提供的默认名为OPENJPA_SEQUENCE
的序列号。这可能引起实体类编号的不连续。我们可以用下面的这个简单例子说明这种情况:假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish,它们的实体标识字段都是数值型,并且都选择使用序列号生成实体标识,但是实体类中并没有提供sequenceName
属性值。当我们首先持久化一个 Dog 对象时,它的实体标识将会是 1,紧接着我们持久化一个 Fish 对象,它的实体标识就是 2,依次类推。initialValue
该属性设置所使用序列号的起始值。 allocationSize
一些数据库的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。 allocationSize
属性设置的就是一次预先分配序列号的数目,默认情况下allocationSize
属性的值是 50。@javax.persistence.TableGenerator
如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 TableGenerator 注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:
表 2. TableGenerator 注释属性说明属性 说明 name
该属性是必须设置的属性,它表示了 TableGenerator
注释在 OpenJPA 容器中的唯一名称,将会被GeneratedValue
注释的generator
属性所使用。将实体标识的自动生成委托给数据库表时,实体标识字段的GeneratedValue
注释的generator
属性的值必须和某个TableGenerator
注释的name
属性值保持一致。table
该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认的表名 OPENJPA_SEQUENCES_TABLE
。schema
该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会默认使用当前数据库用户对应的 schema。 catalog
该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。 pkColumnName
该属性设置的是生成序列号的表中的主键字段的名称,该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 ID
。valueColumnName
该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性,如果开发者没有为该 属性设置值,OpenJPA 容器将会使用默认值 SEQUENCE_VALUE
。pkColumnValue
该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 DEFAULT
。可以为多个实体设置相同的pkColumnValue
属性值,这些实体标识的生成将通过同一列的值的递增来实现。initialValue
该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。 allocationSize
为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。
@org.hibernate.annotations.GenericGenerator
@GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器,由@GenericGenerator实现多定义的策略。所以,它要配合@GeneratedValue一起使用,并且@GeneratedValue注解中的”generator”属性要与@GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略.
@GenericGenerator支持13种策略,分别是(strategy属性取值):
static {
GENERATORS.put("uuid", UUIDHexGenerator.class);
GENERATORS.put("hilo", TableHiLoGenerator.class);
GENERATORS.put("assigned", Assigned.class);
GENERATORS.put("identity", IdentityGenerator.class);
GENERATORS.put("select", SelectGenerator.class);
GENERATORS.put("sequence", SequenceGenerator.class);
GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
GENERATORS.put("increment", IncrementGenerator.class);
GENERATORS.put("foreign", ForeignGenerator.class);
GENERATORS.put("guid", GUIDGenerator.class);
GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
}
格式: (下面代码是使用系统时间生成uuid)
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid",strategy = "uuid")
/** 订单id */
private String orderId;
相关知识博客:
LINK: http://www.cnblogs.com/tobeprogramer/p/4162228.html
LINK: http://www.cnblogs.com/ph123/p/5692194.html