@GeneratedValue:设置主键的生成策略,依赖于具体的数据库
属性 | 类型 | 说明 |
strategy | GenerationType | 它的内容将指定 OpenJPA 容器自动生成实体标识的方式 |
值 | 说明 |
GeneratorType.AUTO | 表示实体标识由 OpenJPA 容器自动生成,这也是 Strategy 属性的默认值。 |
GenerationType.IDENTITY | OpenJPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对自增长字段的支持,常用的数据库中,HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持 |
GenerationType.SEQUENCE | 表示使用数据库的序列号为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供对序列号的支持,常用的数据库中,Oracle、PostgreSQL 等数据库都能够提供这种支持。 |
GenerationType.TABLE | 表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋唯一值,作为实体的标识。 |
属性 | 类型 | 说明 |
generator | String | generator属性中定义实体标识生成器的名称。如果实体的标识自动生成策略不是 GenerationType.AUTO或者 GenerationType.IDENTITY,就需要提供相应的 @SequenceGenerator或者 @TableGenerator注释还有@GenericGenerator注解,然后将 generator属性值设置为注释的 name属性值 |
如果实体标识的自动生策略是 GenerationType.SEQUENCE,开发者需要为实体标识字段提供 SequenceGenerator注释,它的参数描述了使用序列号生成实体标识的具体细节。SequenceGenerator 注释属性说明:
属性 | 说明 |
name | 该属性是必须设置的属性,它表示了 SequenceGenerator注释在 OpenJPA 容器中的唯一名称,将会被 GeneratedValue注释的 generator属性使用。将实体标识的自动生成委托给数据库的序列号特性时,实体标识字段的 GeneratedValue注释的 generator属性的值必须和某个 SequenceGenerator注释的 name属性值保持一致。 |
sequenceName | 实体标识所使用的数据库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框架将自动创建名为 OPENJPA_SEQUENCE的序列号。如果一个 OpenJPA 容器中管理的多个实体都选择使用序列号机制生成实体标识,而且实体类中都没有指定标识字段的 sequenceName属性,那么这些实体将会共享系统提供的默认名为 OPENJPA_SEQUENCE的序列号。这可能引起实体类编号的不连续。 |
initialValue | 该属性设置所使用序列号的起始值。 |
allocationSize | 一些数据库的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新生成序列号。allocationSize属性设置的就是一次预先分配序列号的数目,默认情况下 allocationSize属性的值是 50。 |
如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 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 容器将会使用默认值 SEQUENCE_VALUE。 |
pkColumnValue | 该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 DEFAULT。可以为多个实体设置相同的 pkColumnValue属性值,这些实体标识的生成将通过同一列的值的递增来实现。 |
initialValue | 该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。。 |
allocationSize | 为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。 |
@GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器,由@GenericGenerator实现多定义的策略。所以,它要配合@GeneratedValue一起使用,并且@GeneratedValue注解中的”generator”属性要与@GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略.
值 | 类型 | 说明 |
“uuid” | UUIDHexGenerator.class | |
“hilo” | TableHiLoGenerator.class | |
“assigned” | Assigned.class | |
“identity” | IdentityGenerator.class | |
“select” | SelectGenerator.class | |
“sequence” | SequenceGenerator.class | |
“seqhilo” | SequenceHiLoGenerator.class | |
“increment” | IncrementGenerator.class | |
“foreign” | ForeignGenerator.class | |
“guid” | GUIDGenerator.class | |
“uuid.hex” | UUIDHexGenerator.class | 弃用 |
“sequence-identity” | SequenceIdentityGenerator.class |
例子:
//使用UUID为主键
@Id @GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid",strategy = "uuid")
复合主键
- 使用@IdClass
新建一个主键类Key,这个类需要实现 Serializable 接口,并且需要无参构造函数,重写 equals 和 hashCode 方法
使用时在实体类上使用**@IdClass(Key.class)**,实体类中的主键字段不能少 - 使用@Embeddable和@EmbeddedId
新建一个主键类Key,这个类需要实现 Serializable 接口,并且需要无参构造函数,重写 equals 和 hashCode 方法,字段需要用@Column描述
使用时实体类中主键字段类型为Key,并用@EmbeddedId修饰此字段