Java 将空值添加到非空表org.hibernate.exception.ConstraintViolationException

Java 将空值添加到非空表org.hibernate.exception.ConstraintViolationException,java,hibernate,Java,Hibernate,使用休眠进行数据访问 我在数据库中有一列: varchar(40), default value is set to 0, NOT NULL 我有一个例子,用户发送空值,并得到错误: Error: org.hibernate.exception.ConstraintViolationException: Cannot insert the value NULL into column 'foo', table 'MyTable'; column does not allow nulls

使用休眠进行数据访问

我在数据库中有一列:

varchar(40), default value is set to 0, NOT NULL
我有一个例子,用户发送空值,并得到错误:

Error: org.hibernate.exception.ConstraintViolationException: Cannot insert the value
    NULL into column 'foo', table 'MyTable'; column does not allow nulls. INSERT fails.
hibernate中的列定义如下:

@Column(name = "foo")
private String foo;

问题出在哪里?我必须在hibernate注释或smthing中定义默认值吗?怎么用?或任何其他建议?

尝试将
NULL
插入
非NULL
列时,您预期会发生什么?您可能希望强制执行
非空
约束,然后需要拒绝用户输入,或者希望接受
值,并需要使用
@column(nullable=true)
指定列可以为空


由于当用户不提供字段时,您实际上希望在列中有一个默认值,并且您的代码明确地设置字段值,即使该值为null(或空,例如Oracle也是如此),因此我建议在该字段上设置一个更智能的setter:

private String foo = "0";

public String getFoo() {
    return foo;
}

public void setFoo(String foo) {
    if (foo != null && !foo.isEmpty()) { // Or StringUtils.isNotBlank(foo)
        this.foo = foo;
    }
}

foo
的默认值为空,因为它是类字段

因为您要保存的默认值是0。 如果可能,将
foo
原语类型设置为
int
如果
foo
必须是字符串,则可以删除NOTNULL约束,因为即使不为
foo
赋值,也有默认值0。


建议:考虑使用Hibernate工具生成自动POJO类。这将从现有数据库自动生成您的POJO类。

如果您的表不允许空值,您应该尊重它并采用您的模型

在使用@Column注释时,应首先将属性nullable设置为false,为支持默认值,还应使用列定义

@Column(name = "foo", nullable = false, columnDefinition = “varchar(40) default 0″)

为什么varchar不是默认值“”?如果要将该列设为NULL,为什么要将该列定义为NOTNULL?有什么具体原因吗?@shan我不想在那里输入null,我想在那里输入默认值,当用户输入null时,您需要查看生成的SQL,尽管我怀疑它试图在foo中输入null值,在这种情况下,DB不会尝试使用默认值。因此失败了,仍然不知道为什么varchar的默认值会是0,尽管…该列的默认值生效,但该列没有赋值,将NULL赋值给该列与上述不同。如果您想特别强制NULL->默认值转换,最好的方法是删除赋值->不传递列的任何值。而且,正如“ramsinb”所提到的,0是varchar列非常不寻常的默认值……我不想在那里输入null,我想在数据库中输入默认值,当用户插入null时,然后在字段上指定一个默认值:
private String foo=“default”?但我的代码会覆盖它并将其设置为null,我是否可以将null发送到NOTNULL列,并且在数据库中,当我看到null时,它将是数据库中设置的默认值。“Default”不是这样工作的吗?不,表列上的
Default
值不是这样工作的。如果在SQL更新/插入中未指定列,则将使用默认值,但Hibernate将生成一个包含所有映射字段的请求,因此
foo
将始终存在。您必须以编程方式在POJO上设置值,或者您可以修改setter以忽略null/empty值,使默认值保留在那里。目前的问题是数据库在
foo
中保存了大量null值,但我希望存在
0
而不是
null
,默认情况下它不会这样做。@Jaanus:您的数据库将处于不一致的状态。写入更新查询以将空值修改为0。类似于:
updatetable set col=0,其中col为null
这无关紧要,我截断了我的表,只需要所有未来的记录保存值0而不是null。如何才能做到这一点?Vash解决方案接近我需要的。我添加了这个,仍然得到相同的错误。当我使用varchar时,我可以使用
默认值0
还是必须像
默认值“0”
?有什么建议吗?