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的主要内容,如果未能解决你的问题,请参考以下文章