【发布时间】:2017-09-02 20:11:40
【问题描述】:
这是我在 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我已经有一个预先存在的数据库,并且if我打算使用Hibernate来仅仅验证 那个数据库而不是为我创建一个(通过hibernate.hbm2ddl.auto = validate),并且如果 我的数据库表配置了一个自动递增的主键字段,然后是什么值(在 应用层)@Id 提供给我吗?含义,给定:
-
hibernate.hbm2ddl.auto = validate;和 - 表/实体有一个自动递增的 PK(例如 MySQL
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 是否仍以某种方式为我的应用提供价值(如果是,如何)?
【问题讨论】:
-
每个对象都必须有一个 IDENTITY。如果您没有
@Id,则对象没有身份,因此无效。如果数据存储区正在执行 AUTO_INCREMENT,那么您应该将该字段标记为@GeneratedValue(strategy=IDENTITY),就像 JPA 规范告诉您的那样,这样 JPA 提供者就知道它被归因于数据存储区 -
谢谢@NeilStockton (+1) 如果你不介意的话,还有几个后续问题:(1) 我发现的所有 Hibernate/JPA 文档中都有措辞表明
@GeneratedValue(strategy = GenerationType.IDENTITY)用于配置JPA 提供者(Hibernate)并声明JPA(不是DB)应该如何生成值。我不希望 Hibernate 生成我的 PK 值,我希望数据库生成。您肯定GenerationType.IDENTITY不会与 MySQL 自动生成的内容发生冲突吗? -
另外 (2) 当你说“如果你没有
@Id那么一个对象没有身份,因此是无效的”你所说的“无效”是什么意思? Hibernate会抛出异常吗?它会在我的代码的其他地方引起问题吗(这是问题的根源)。再次感谢! -
IDENTITY 表示该列使用 AUTO_INCREMENT/SERIAL/IDENTITY,因此其值在数据存储区中设置(因此 不出现在 INSERT 语句中)。这就是 JPA 规范所说的。至于 2,所有实体都必须定义一个身份,同样来自 JPA 规范
-
谢谢,现在运行我的应用程序没有
@Id,一切似乎都运行良好。认为我暂时将其保留,因为它似乎只是为了满足规范要求,但在 Hibernate 正在验证并且数据库正在自动递增时没有做任何功能。
标签: hibernate jpa primary-key auto-increment