org.hibernate.exception.ConstraintViolationException:无法更新 - DB 中的自动增量列为 NULL

Posted

技术标签:

【中文标题】org.hibernate.exception.ConstraintViolationException:无法更新 - DB 中的自动增量列为 NULL【英文标题】:org.hibernate.exception.ConstraintViolationException: could not update - Auto-increment column in DB is NULL 【发布时间】:2017-11-13 09:56:08 【问题描述】:

我正在将系统的 hibernate3 软件包从版本“3.1.1”升级到“3.6.10”。

由于我已经将它迁移到 3.6.10 版本,我看到了一个异常:

[6/12/17 9:54:57:365 SGT] 000000a2 SystemOut     O [DEBUG] [8adbbb8205c9a02b50015c09a02d15e00000|TKN_ENQ_REQ|10.91.48.113] 12/06/17 09:54 ib.CustomerVerification  - [Ex
ception Caught Caused By:]
<b>org.hibernate.exception.ConstraintViolationException: could not update: </b>[com.dbs.tms.main.pojo.Customer#8adbbb825c9a02b5015c9a02da3e0001]
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2613)
        at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2495)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2822)
        at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
        at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:64)
       ... 
       ....
       ...
       ..
<b>Caused by: com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Assignment of a NULL value to a NOT NULL column "TBSPACEID=5, TABLEID=9, COLNO=1" is not allowed
.. SQLCODE=-407, SQLSTATE=23502, DRIVER=3.64.133 </b>
        at com.ibm.db2.jcc.am.bd.a(bd.java:675)
        at com.ibm.db2.jcc.am.bd.a(bd.java:60)
        at com.ibm.db2.jcc.am.bd.a(bd.java:127)

当我更新时,CUSTOMERS 表 (TABLEID=9) 中的列 (COL=1) 似乎为 NULL。该值由数据库 (DB2) 自动生成,应在客户对象中设置。

列 DB 属性:

客户的 HBM.xml(突出显示的是出现 Null 值的列(不应为 Null):

希望有人可以帮助解决我的问题。

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法。

我在客户的 HBM.xml 中添加了 insert="false" 和 update="false"。

在hibernate 3.1.1版本中,这两个参数,即使不存在,生成的SQL也是不包含tknSysGenId,但是在3.6.10版本中,是包含的,因为它的值为null ,它在更新数据库中的表时会引发错误。因此我们需要明确声明列 tknSysGenId 不应作为参数之一包含在更新语句中。

所以它的新值是:

【讨论】:

以上是关于org.hibernate.exception.ConstraintViolationException:无法更新 - DB 中的自动增量列为 NULL的主要内容,如果未能解决你的问题,请参考以下文章