在写项目时为数据库主键为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 注释属性说明
属性 | 说明 |
| 该属性是必须设置的属性,它表示了 |
| 实体标识所使用的数据库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框架将自动创建名为 |
| 该属性设置所使用序列号的起始值。 |
| 一些数据库的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。 |
@javax.persistence.TableGenerator
如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 TableGenerator 注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:
- 表 2. TableGenerator 注释属性说明
属性 | 说明 |
| 该属性是必须设置的属性,它表示了 |
| 该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认的表名 |
| 该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会默认使用当前数据库用户对应的 schema。 |
| 该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。 |
| 该属性设置的是生成序列号的表中的主键字段的名称,该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 |
| 该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性,如果开发者没有为该 属性设置值,OpenJPA 容器将会使用默认值 |
| 该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 |
| 该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。 |
| 为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,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;