首先说明表关系:
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 " />
级联你也没配置你的担心纯属多余。