竟然是这个原因导致Hibernate级联保存出错
今天帮朋友改一个问题,hibnernate的级联保存出错,莫名奇妙的错误,一会session关闭了,一会瞬时对象无法保存,一遍又一遍的检查这mapping文件,没什么问题啊,这是单项一对多关联:
一端:
<hibernate-mappingpackage="com.bestv.bi.usertrack.model">
<classname="ParameterRecord"table="fact_parameterrecord">
<idname="id"type="long">
<columnname="id"precision="22"scale="0"/>
<generatorclass="sequence">
<paramname="sequence">SEQ_PARAMETERRECORD</param>
</generator>
</id>
。。。
<setname="paraValues"
table="FACT_PARAVALUE"
lazy="false"
inverse="false"cascade="all">
<keycolumn="RECORD_ID"/>
<one-to-manyclass="ParaValue"/>
</set>
</class>
</hibernate-mapping>
多端不做配置。
感觉没什么错啊。
再加上flex前台通过blazeds访问后台,一开始都没有打出报错信息,以为是事务没有配置好,改来改去都不对。后来打出faultevent信息,才发现定位到hibnerate数据库保存出错。可是想来想去也不知为什么。后来才发现tmd他的FACT_PARAVALUE表中的RECORD_ID有个不能为空的约束导致的这个问题。
原因是,当hibernate保存ParameterRecord对象的时候,是先保存fact_parameterrecord表的记录和FACT_PARAVALUE表的记录,然后再去updateFACT_PARAVALUE表中RECORD_ID字段。也就是说,在保存FACT_PARAVALUE记录的时候是没有RECORD_ID信息的,而这个字段恰好有notnull约束,所以导致错误。