Hibernate / SQLException: 字段没有默认值

3

使用以下命令生成了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对象并将其保存到数据库时,会出现此错误。

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

感谢您的时间, Samuel Smith

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


你能否在 MySQL Workbench 中插入数据到表中而不指定 actorID? - Taylor
嗯...我以前遇到过这个问题。找起来真的很困难。如果您删除了 @Column 注释,会发生什么?依我之见,它是不必要的。 - Bart
3个回答

3

您的错误在于表格定义。

必须是:

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

您在actorID中遗漏了AUTO_INCREMENT。


这仍然会导致相同的错误,因为actorName也没有定义默认值。 - BARJ
当您在数据库中创建新记录时,通常不手动设置ID。但是您必须设置所有其他列,特别是非空列。 为列actorName设置默认值没有意义。 - alvaro torrico

3

试着使用

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

如果保存时不需要指定 actorID,则将其保留为空。这应该可以解决你的问题。

同时确保数据库正常工作,尝试写一个插入语句而不插入 ID,看看纯插入是否有效。如果直接向数据库插入数据有效,则可以开始排查 hibernate 的问题。

还有一点,我通常会在定义列的同时定义 PH 和自动增量:

actorID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,

但无论哪种方式都应该可以工作。


细节问题,但 int 不能为 null。它将被初始化为零。 - Bart
1
好的,我已经按照你上面描述的方式更改了变量映射,但是没有任何效果。然而,我删除了整个数据库,并重新构建了所有表格,这次使用了类似于你在这里展示的SQL语法,现在它完美地工作了。我不认为是语法本身的改变,而是因为它与之前相比有很大的不同,它强制刷新了某个地方,从而解决了问题(AUTO_INCREMENT最初是后来添加的,所以也许新数据库还没有被缓存或者其他什么原因...我不太确定)。 - Samuel Smith
我曾经遇到过同样的问题,解决方法是清空整个数据库并重新运行应用程序。现在一切都正常了。 - Gabriel Rogath

1

我曾经遇到过同样的问题,解决方法是清空整个数据库并重新运行应用程序。现在一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接