当前位置: 代码迷 >> J2EE >> org.springframework.dao.DataIntegrityViolationException: could not
  详细解决方案

org.springframework.dao.DataIntegrityViolationException: could not

热度:509   发布时间:2016-04-22 03:12:10.0
Hibernate插入与删除数据的问题
首先说明表关系:
Chickling为外键表;ChicklingManufecturer为主键表;
外键表ManufecturerNumber字段与主键表关联;
XML code
<many-to-one name="chicklingManufecturer" class="manufecturerPojo.ChicklingManufecturer" fetch="select">            <column name="ManufecturerNumber" length="50" />        </many-to-one>

Chickling表有非自增的主键ChicklingNumber,本身作为ChicklingNumber表的主键表;
XML code
 <id name="chicklingNumber" type="java.lang.Integer">            <column name="ChicklingNumber" />            <generator class="identity" />        </id>

XML code
      <set name="productTraceInfos" inverse="true">            <key>                <column name="ChicklingNumber" />            </key>            <one-to-many class="pojo.ProductTraceInfo" />        </set>


现在我要向Chickling中插入数据,Action中的代码我这样写的: 
Java code
        chickling.setBatch("1");        ChicklingManufecturer CM= new ChicklingManufecturer();//创建子表对象        CM.setManufecturerName("1");//设置子表的主键值chickling.setChicklingNumber(new Integer(5));        chickling.setChicklingManufecturer(CM);        chickling.setChicklingName("123");        chickling.setDate(new Date());        chickling.setGgeneration("gg");        chickling.setIncubatorNumber("123");        chickling.setInputNumber(new Integer(1));        chickling.setPgerneration("456");        chickling.setRemark("remark");Service.Save(chickling);

异常如下:
Hibernate: insert into TraceSystem.dbo.Chickling (ManufecturerNumber, Date, Batch, GGeneration, PGerneration, ChicklingName, Remark, IncubatorNumber, InputNumber) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
org.springframework.dao.DataIntegrityViolationException: could not insert: [pojo.Chickling]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [pojo.Chickling]
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [pojo.Chickling]

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 不能将值 NULL 插入列 'ChicklingNumber',表 'TraceSystem.dbo.Chickling';列不允许有空值。INSERT 失败。

从显示的SQL语句可以看出它没有去插入主键值.我很奇怪为什么.不可能是因为是主键所以不能插入吧?我又没设置为自增的.

还有问题就是,我传入了一个子表的对象如果我保存Chickling对象时,会不会在子表中也出现一条记录?
同样如果我删除会不会删除一条对应的记录?
我猜是不会...但是还是请前辈们指教.
小弟第一次做这样几张表关联的东西,弄的很郁闷...如果有什么经验,还望前辈们指点.

------解决方案--------------------
看是主键生成策略的问题
修改哈映射文件
------解决方案--------------------
你既然表中没有设置自动增长的,而且映射文件中也没有设置自动增长的
那么就更应该要显示的插入ChicklingNumber的值啦
ChicklingNumber又是表的主键,你说主键能为空么??
------解决方案--------------------
<generator class="identity" />
主键生成策略error
这种是要求DB有标识和步长的那种,你自己指定要 <generator class="assigned " />

级联你也没配置你的担心纯属多余。
  相关解决方案