我正在使用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约束?
如果您在Spring源代码中搜索DataIntegrityViolationException的构造函数的调用者,则会发现它是在调用的org.springframework.orm.hibernate3.SessionFactoryUtils:
org.springframework.orm.hibernate3.SessionFactoryUtils
return new DataIntegrityViolationException(ex.getMessage() + "; SQL [" + jdbcEx.getSQL() + "]; constraint [" + jdbcEx.getConstraintName() + "]", ex);
因此,异常是由违反的约束引起的,并且null是JDBC异常返回的约束的名称。因此,您应该责怪MySQL驱动程序没有在JDBC异常中填充违反的约束名称。但是违反的约束可以是任何约束,而不一定是not null约束。
null
not null