这是我在Hibernate文档中高低搜索的内容,并且令人惊讶地无法找到答案。
几乎所有Hibernate / JPA的规范示例都演示了通过@Id
注释配置主键,如下所示:
// Groovy pseudo-code!
@Entity
class Car {
@Id
@Column(name = "car_id")
Long id
@Column(name = "car_make")
String make
@Column(name = "car_model")
String model
}
但是,如果我已经有一个预先存在的数据库, if 我打算使用Hibernate来仅仅验证< / em>该数据库而不是为我创建一个(通过hibernate.hbm2ddl.auto = validate
),而如果我的数据库表配置了一个自动递增的主键字段,然后是什么值(在应用层)@Id
为我提供了什么?意思是,给定:
hibernate.hbm2ddl.auto = validate
;和AUTO_INCREMENTING
) ...那么我的应用程序对我的实体类是否包含@Id
有什么影响呢?为什么我不能这样写:
// Groovy pseudo-code!
@Entity
class Car {
@Column(name = "car_id")
Long id
@Column(name = "car_make")
String make
@Column(name = "car_model")
String model
}
或者@Id
是否仍以某种方式为我的应用提供价值(如果是,如何)?
答案 0 :(得分:1)
如果表自动递增,JPA @Id是否提供值?
简短回答否。注释@Id仅指定实体的主键。如果您希望自动生成其值,则必须使用@GeneratedValue对该字段进行注释,以指示相应的GenerationType策略,即:IDENTITY:
@Entity
class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "car_id")
Long id
/...
}
请注意,所有RDBMS都不支持自动增量或串行类型,即:Oracle没有自动增量作为类型,但您可以创建并使用序列。