当前位置: 首页 > 面试题库 >

Hibernate不尊重MySQL auto_increment主键字段

车胤运
2023-03-14
问题内容

我正在尝试学习Hibernate的工作方式,并且几乎陷入了无法接受的学习曲线。我看不到如何使Hibernate尊重我的对象的auto_increment策略。而是使用现有ID(从1开始)覆盖数据库中的条目。

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

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

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

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

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

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

我尝试了一些变化@GeneratedValue(使用所有可能的策略,省略了括号子句)。甚至有人建议GeneratedValue完全放弃。似乎没有任何作用。

我要丢东西了吗?我想念什么?hibernate真的难吗?

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


问题答案:

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



 类似资料:
  • 问题内容: 我有一个使用Hibernate为HSQL db生成表的应用程序(因为我的应用程序仍在开发中)。在我的域模型中,我已经设定 当我使用DBVisualizer打开数据库时,可以看到所有设置都正确,除了它无法正常工作外,我的列接受的长度超过10个字符的值。当我尝试在DBVisualier中手动运行查询时,它会失败,但是应该进入休眠状态。 同样非常奇怪的是,当我使用文件(而不是在内存db中)以

  • 问题内容: 我在SQLite中有一些表,我试图弄清楚如何重设自动递增的数据库字段。 我读到DELETE FROM tablename应该删除所有内容,并将auto-incrementment字段重置为0,但是这样做时,它只会删除数据。插入新记录后,自动增量将从删除前的中断处开始提取。 我的ident字段属性如下: 栏位类型:integer 字段标志:PRIMARY KEY,AUTOINCREMEN

  • 我有两个实体 和 此映射: 最近增加了。 在运行应用程序时,应用程序崩溃,错误是:通过JDBC语句执行DDL“alter table documents add debt__idbigint not null”时出错 我检查了Hibernate发送到数据库的sql查询,它是:更改表文档添加debt_idbigint不null 此查询失败,因为表上已经有记录,因此无法添加不带默认值的不可为空列。 那

  • 问题内容: 在纯Java SE 6环境中: Eclipse控制台中未显示任何内容。 l.info(“”) 及以上的作品就好了,但低于任何 罚款 只是似乎没有工作。有什么问题吗?TIA。 问题答案: 即使Logger级别设置为ALL,ConsoleHandler(记录器上的默认Handler)仍然具有INFO的默认级别。这来自 JAVA_HOME / jre / lib中 的默认logging.pr

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h

  • 我有一些实体: 当我试图保存新的cbonus记录时,出现异常: org.postgresql.util.PSQLException: ERROR: null值在列"bank_id"的关系"cBonus"违反了非空约束详细信息:失败的行包含(773, gp3, null, null, f)。 和查询 DEBUG 24817-[nio-8080-exec-4]org . hibernate . SQL