@Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ GenerationType strategy() default AUTO; String generator() default ""; }
public enum GenerationType{ TABLE, SEQUENCE, IDENTITY, AUTO }
TABLE | 使用一个特定的数据库表格来保存主键 |
SEQUENCE | 根据底层数据库的序列来生成主键,条件是数据库支持序列 |
IDENTITY | 主键由数据库自动生成(主要是自动增长型) |
AUTO | 主键由程序控制 |
@Entity @Table(name = "TAB_PLAYER") @TableGenerator(name = "tab-store", table = "AUTO_ID_GENERATOR", pkColumnName = "G_KEY", pkColumnValue = "TAB_PLAYER_PK", valueColumnName = "G_VALUE", allocationSize = 1) public class Player { private Long id; @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "tab-store") @Column(unique = true, nullable = false) //unique指定是否唯一,nullable指定是否可以为空 public Long getId() { return id; } ...... }
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface TableGenerator { String name(); String table() default ""; String catalog() default ""; String schema() default ""; String pkColumnName() default ""; String valueColumnName() default ""; String pkColumnValue() default ""; int initialValue() default 0; int allocationSize() default 50; UniqueConstraint[] uniqueConstraints() default {}; }
@Entity @Table(name = "SMS_DEPT") @SequenceGenerator(name="MyTableGenerator",sequenceName="SEQ_SMS_DEPT") public class Dept { private Long id; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="MyTableGenerator") @Column(unique = true, nullable = false) public Long getId() { return id; } ......
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; int initialValue() default 0; int allocationSize() default 50; }
@Entity @Table(name = "SMS_DEPT") public class Dept { private Long id; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(unique = true, nullable = false) public Long getId() { return id; } ......
@Entity @Table(name = "SMS_DEPT") public class Dept { private Long id; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; } ......
生成器
|
描述
|
native | 根据底层的数据库对自动生成OID能力的支持,具体选择identity,sequence或者hilo生成器来产生OID,常用于跨平台应用, 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用) |
uuid | 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型) |
hilo | 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用) |
assigned | 在插入数据的时候主键由程序处理(很常用),这是 <generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO |
identity | OID由底层的数据库自增主键生成机制产生,如MySql的auto_increment类型主键和SQL SERVER的identity类型主键,这个方法不能放到Oracle中,Oracle不支持自增字段 |
select | 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用) |
sequence | 调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到 |
seqhilo | 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用) |
increment | OID由Hibernate依递增方式产生,该算法依赖保存于当前应用实例中的一个最大值变量,当有多个应用实例需要访问数据库难免会出现重复的主键,应当慎重使用 |
foreign | 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用 |
guid | 采用数据库底层的guid算法机制,对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等 |
uuid.hex | 同理uuid,建议用uuid替换 |
sequence-identity | sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本 |
@Id @GeneratedValue(GenerationType.AUTO)
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")
@Target({PACKAGE, TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface GenericGenerator { /** * unique generator name */ String name(); /** * Generator strategy either a predefined Hibernate * strategy or a fully qualified class name. */ String strategy(); /** * Optional generator parameters */ Parameter[] parameters() default {}; }
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); }
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "native")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "hilo")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "identity")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name="select", strategy="select", parameters = { @Parameter(name = "key", value = "idstoerung") })
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "sequence", parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo", parameters = { @Parameter(name = "max_lo", value = "5") })
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "increment")
@Entity public class Employee { @Id @GeneratedValue(generator = "idGenerator") @GenericGenerator(name = "idGenerator", strategy = "foreign", parameters = { @Parameter(name = "property", value = "info") }) Integer id; @OneToOne EmployeeInfo info; ... }
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "guid")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")
@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity", parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })