org.springframework.dao.DataIntegrityViolationException误报原因?
我正在使用hibernate插入一个mysql表,其中所有列都定义为非null。 它具有唯一的主键和多个列上的另一个唯一索引。
我收到以下错误:
org.springframework.dao.DataIntegrityViolationException:无法执行JDBC批量更新; SQL [插入MY_TABLE(col1,col2,col3,col4,ID_)值(?,?,?,?,?)]; 约束[null]
此错误在客户日志中,我无法自己重现问题,因此我无法进行调试以查看insert语句中的值。
我的理解是“约束[null]”意味着违反了“非空”约束。 但是,看看我的代码,我看不到任何可能的方式,任何数据在插入时都可能为null,除非hibernate试图插入一个空ID(这在hibernate中是一个非常糟糕的bug,所以似乎不太可能)。
但是,我可以看到如何发生违反唯一约束的情况。 该消息是否可能具有误导性,我实际上是在获得一个独特的密钥违规? “constraint [null]”是否始终意味着违反了非空约束?
如果在Spring源代码中搜索DataIntegrityViolationException构造函数的调用者,您会发现它在org.springframework.orm.hibernate3.SessionFactoryUtils
调用:
return new DataIntegrityViolationException(ex.getMessage() + "; SQL [" + jdbcEx.getSQL() + "]; constraint [" + jdbcEx.getConstraintName() + "]", ex);
因此exception是由违反的约束引起的,而null
是JDBCexception返回的约束的名称。 所以你应该责怪MySQL驱动程序没有填充JDBCexception中违反的约束名称。 但是违反的约束可以是任何约束,并且不一定是非not null
约束。
您可以直接从Hibernate的exception类型中获取Constain名称。 使用
getConstraintName
获取数据库约束名称的属性。
} catch (ConstraintViolationException conEx) { if (conEx.getConstraintName().contains("PROJECT_UK")) { //TODO Project Entity is violating it's constrain
我使用了包含,因为我希望这个应用程序在多个数据库架构上运行。 默认情况下,getConstraintName附带DB名称
MyDBName.ConstrainName
- 模型类在Hibernate中运行多个查询..!
- 如何在EntityListeners中注入EntityManager
- 没有基础表的JPA实体
- 在传统世界中需要Hibernate
- 何时使用Spring JPA(Hibernate)实体管理器将连接返回到连接池?
- 给出java.lang.IllegalArgumentException的Hibernate查询:遍历的节点不能为null
- 无法解析 – org.dom4j.DocumentException:org.dom4j.DocumentFactory无法强制转换为org.dom4j.DocumentFactory
- ParameterizedType并创建一个通用的dao
- 用于3个表之间连接的Hibernate查询条件