基于注解的hibernate主键设置:@Id.
那么它的生成规则是什么呢?是由@GeneratedValue来规定的。
我们先来看看它是如何定义的:
[code]@Target({METHOD,FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue{
GenerationType strategy() default AUTO;
String generator() default "";
}[/code]
[code]public enum GenerationType{
TABLE,
SEQUENCE,
IDENTITY,
AUTO
}[/code]
现在我们看到了,它提供了4种生成策略:
TABLE:使用一个特定的数据库表格来保存标识符序列。
SEQUENCE:生成序列化标识符。
IDENTITY:标识符有数据库自动生成(主要是自动增长型)
AUTO:标识符生成工作由hibernate自动处理。实际项目开发不建议使用。
[color=red]注意:当主键为int,而数据库中又不是自动增长型时,使用@GeneratedValue是无法正常工作的。[/color]
我们也可以使用下面的方式来自己指定我们的主键值:
[code]@GeneratedValue(generator = "c-assigned")
@GenericGenerator(name = "c-assigned", strategy = "assigned")
private String employeeId;[/code]
或者直接不要定义@GeneratedValue,只定义@Id效果也是一样的。
那么它的生成规则是什么呢?是由@GeneratedValue来规定的。
我们先来看看它是如何定义的:
[code]@Target({METHOD,FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue{
GenerationType strategy() default AUTO;
String generator() default "";
}[/code]
[code]public enum GenerationType{
TABLE,
SEQUENCE,
IDENTITY,
AUTO
}[/code]
现在我们看到了,它提供了4种生成策略:
TABLE:使用一个特定的数据库表格来保存标识符序列。
SEQUENCE:生成序列化标识符。
IDENTITY:标识符有数据库自动生成(主要是自动增长型)
AUTO:标识符生成工作由hibernate自动处理。实际项目开发不建议使用。
[color=red]注意:当主键为int,而数据库中又不是自动增长型时,使用@GeneratedValue是无法正常工作的。[/color]
我们也可以使用下面的方式来自己指定我们的主键值:
[code]@GeneratedValue(generator = "c-assigned")
@GenericGenerator(name = "c-assigned", strategy = "assigned")
private String employeeId;[/code]
或者直接不要定义@GeneratedValue,只定义@Id效果也是一样的。