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”
?有什么建议吗?