一尘不染

org.springframework.dao.DataIntegrityViolationException错误报告原因?

hibernate

我正在使用hibernate插入到所有表均定义为非null的mysql表中。它有一个唯一的主键,并在几列上有另一个唯一的索引。

我收到以下错误:

org.springframework.dao.DataIntegrityViolationException:无法执行JDBC批处理更新。SQL
[插入MY_TABLE(col1,col2,col3,col4,ID_)值(?,?,?,?,?)] 约束[空]

此错误出现在客户日志中,我自己无法重现该问题,因此无法进行调试以查看insert语句中的值。

我的理解是“ constraint [null]”表示违反了“ not
null”约束。但是,查看我的代码,我看不到任何数据插入时任何数据都可能为null的可能方式,除非hibernate试图插入null
ID(这在hibernate中是一个非常糟糕的错误,因此似乎不太可能)。

但是,我可以看到违反唯一约束的情况。该消息是否可能会误导我,并且实际上收到了唯一的密钥冲突?“ constraint
[null]”是否总是表示违反了非null约束?


阅读 1242

收藏
2020-06-20

共1个答案

一尘不染

如果您在Spring源代码中搜索DataIntegrityViolationException的构造函数的调用者,则会发现它是在调用的org.springframework.orm.hibernate3.SessionFactoryUtils

return new DataIntegrityViolationException(ex.getMessage()  + "; SQL [" + jdbcEx.getSQL() +
                "]; constraint [" + jdbcEx.getConstraintName() + "]", ex);

因此,异常是由违反的约束引起的,并且null是JDBC异常返回的约束的名称。因此,您应该责怪MySQL驱动程序没有在JDBC异常中填充违反的约束名称。但是违反的约束可以是任何约束,而不一定是not null约束。

2020-06-20