【问题标题】:Hibernate / SQLException: field doesn't have default valueHibernate / SQLException:字段没有默认值
【发布时间】:2014-02-10 05:16:09
【问题描述】:

使用以下方法生成的 mySQL 表:

CREATE TABLE `actors` (
    `actorID` INT(11) NOT NULL,
    `actorName` VARCHAR(255) NOT NULL,
     PRIMARY KEY AUTO_INCREMENT (actorID)
);

映射类:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "actorID", length = 11, unique = true, nullable = false)
private int actorID;
....

错误:

ERROR: Field 'actorID' doesn't have a default value

在尝试创建新的 Actor 对象并将其保存到数据库时遇到此错误。

根据类似问题的答案,我尝试过使用其他生成策略,并删除/重建表/整个数据库。到目前为止没有运气。

感谢您的宝贵时间, 塞缪尔·史密斯

编辑:删除表并使用 shippi 显示的 SQL 语法重新创建它似乎解决了我的问题。

【问题讨论】:

  • 不指定actorID可以通过mysql workbench插入表吗?
  • Errrhh...我前段时间遇到了这个问题。真的很难找到。如果你删除了@Column 注释会发生什么?恕我直言,不需要它。

标签: java mysql hibernate


【解决方案1】:

尝试使用

@GeneratedValue(strategy=GenerationType.AUTO)
@Id
@Column(name = "actorID")
private int actorID;

这应该可以解决您的问题。如果保存,则将 actorID 保留为空。

还要确保数据库正常工作,尝试编写插入语句而不插入 ID,然后看看纯插入是否正常工作。如果直接插入对数据库有效,您可以开始对休眠进行故障排除。

还有一点,我用来在定义列的同一行中定义 PH 和自动增量:

actorIDINT(11) NOT NULL AUTO_INCREMENT 主键,

但它应该可以工作。

【讨论】:

  • 次要细节,但 int 不能为 null。它将被初始化为零。
  • 好的,所以我将变量映射更改为您上面描述的,它没有效果。但是,我删除了整个数据库,并重建了所有表,这一次使用类似于您在此处显示的 SQL 语法,并且它运行良好。我不认为这是语法更改本身,但是因为它与以前有很大不同,所以它强制在某个地方进行刷新以解决问题(AUTO_INCREMENT 最初是后来添加的,所以也许新数据库没有被缓存或其他东西。 ..我不太确定)
  • 我遇到了同样的问题,解决了清空整个数据库以清空并重新运行应用程序。一切都不正常。
【解决方案2】:

您的错误在您的表定义中。

必须是:

CREATE TABLE `actors` (
   `actorID` INT(11) NOT NULL AUTO_INCREMENT,
   `actorName` VARCHAR(255) NOT NULL,
   PRIMARY KEY AUTO_INCREMENT (actorID)
);

您错过了 actorID 中的 AUTO_INCREMENT。

【讨论】:

  • 这仍然会导致同样的错误,因为actorName 也没有定义默认值。
  • 在数据库中创建新记录时,通常不会手动设置 ID。但是您必须设置所有其他列,特别是非空列。为 actorName 列设置默认值是没有意义的。
【解决方案3】:

我有同样的问题,解决它清空整个数据库清空并重新运行应用程序。一切都不正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2013-11-11
    • 2021-03-29
    • 1970-01-01
    • 2016-03-22
    • 2020-01-02
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多