休眠不尊重MySQL auto_increment主键字段

2022-09-02 01:05:39

我试图了解Hibernate是如何工作的,我遇到了一个几乎不可接受的学习曲线。我看不出如何让Hibernate尊重我的对象的auto_increment策略。相反,它使用现有 ID 覆盖数据库中的条目,从 1 开始。

我有一个简单的对象,由一个MySQL表支持,定义如下:Foo

CREATE TABLE `Foo` (
  `fooId` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`fooId`),
)

我已经确认使用SQL()手动插入多个Foo对象是正确的。insert into Foo values();

我的 Java 类具有使用如下所示的注释指定的 ID:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fooId")
private Integer id;

然后,我执行一些测试代码,这些代码只是实例化 Foo 对象并将其保存到数据库中(使用 )。它似乎使用自己的主键序列,从一个开始,并且不查看表的键策略。它覆盖了那里的任何东西。session.save(obj)

我已经尝试了位的变体(使用所有可能的策略,省略括号子句)。有人甚至建议完全放弃。似乎什么都行不通。@GeneratedValueGeneratedValue

我是否遗漏了什么?我错过了什么?冬眠真的这么难吗?

(如果有人有替代的Java数据库持久性选项,请建议一个。我正在制作原型,而不是持久的mondo工程项目。


答案 1

我相信你想要.MySql 不使用表或序列来生成 Id 值。GenerationType.IDENTITY


答案 2

我在接受的答案下的评论中写了这个,但默认情况下不会显示这些,所以我会将其作为答案重新发布。

我正在使用一个休眠.cfg.xml文件,它来自某个家伙的网站,它有这个:

<property name="hibernate.hbm2ddl.auto">create</property>

这使得系统在每次运行应用程序时都重新创建我的表。注释出来解决了问题。

关于创建 ID 的各种方法的其他两个答案是正确的。我最初问题的症状似乎与ID生成有关,但实际原因是配置错误。


推荐