论坛首页 Java企业应用论坛

one-to-many级联保存为什么child对象没有生成insert语句,只...

浏览 6556 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-03-12  
保存的时候,只有parent对象生成了insert语句,而child对象只生成一个update语句?哪位帮我看看,我折腾一个下午了。:(

引用
Hibernate: insert into WD_Equipment (EquipName, EquipType, EquipId) values (?, ?, ?)
update WD_Slot set SlotName=?, SlotType=?, EquipId=?, IfUse=? where SlotId=?


Equipment 与 Slot 是父子关系
Equipment.hbm.xml

引用
<class name="com.zhongying.atm.common.Equipment" table="WD_Equipment"> <id name="equipId" type="long" column="EquipId"> <generator class="hilo"/></id> <property name="equipName" type="string" column="EquipName" unique="true"/> <property name="equipType" type="string" column="EquipType"/> <bag name="slots" lazy="true" inverse="true" cascade="all"> <key column="EquipId"/> <one-to-many class="com.zhongying.atm.common.Slot"/> </bag> </class>

Slot.hbm.xml
<class name="com.zhongying.atm.common.Slot" table="WD_Slot">
<id name="slotId" type="long" column="SlotId" unsaved-value="none">
<generator class="hilo"/></id>
<property name="slotName" type="string" column="SlotName"/>
<property name="slotType" type="string" column="SlotType"/>
<many-to-one name="equipment" column="EquipId" not-null="true"/>
<property name="ifUse" type="boolean" column="IfUse"/>
</class>


存储代码
   Equipment equip = new Equipment();;
     equip.setEquipName("shhaibeijing");;
     equip.setEquipType("type");;
     List array = new ArrayList();;
     equip.setSlots(array);;

     Slot slot = new Slot();;
     slot.setSlotName("sh-slot1");;
     slot.setSlotType("ss");;
     equip.addSlot(slot);;


     session.save(equip);;
     session.flush();;


以下是出错log
引用
et.sf.hibernate.HibernateException: SQL update or deletion failed (row not found)

at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:25)

at net.sf.hibernate.persister.EntityPersister.update(EntityPersister.java:642)

at net.sf.hibernate.persister.EntityPersister.update(EntityPersister.java:611)

at net.sf.hibernate.impl.ScheduledUpdate.execute(ScheduledUpdate.java:31)

at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2100)

at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2062)

at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2005)

at com.zhongying.atm.db.DbAccess.main(DbAccess.java:203)

7471 [main] DEBUG net.sf.hibernate.transaction.JDBCTransaction  - rollback
   发表时间:2004-03-13  
试试把inverse=false看看!
0 请登录后投票
   发表时间:2004-03-13  
引用

&lt;id name="slotId" type="long" column="SlotId" unsaved-value="none"&gt;
&lt;generator class="hilo"/&gt;&lt;/id&gt;

unsaved-value="none"???
还有,equip.addSlot(slot); 都做了些什么?
0 请登录后投票
   发表时间:2004-03-14  
抱歉,这两天电脑闹病毒。
感谢上面两位朋友的回贴,我试过去掉inverse="true",这应该跟inverse="false"一样吧?也没用,
至于设置unsaved-value="none"也是后来加的,没加这个之前也不行。
equip.add(slot) 里面完成的功能是

 slot.setEquipment(this);;
  this.getSlot();.add(slot);;


  我想应该也没有问题。
我看了精华板的one-to-many,各位朋友碰到的问题都是子表添加不成功,
不知道最后解决没有。
我用的是oracle8i数据库。难道是因为病毒的关系?
0 请登录后投票
   发表时间:2004-03-15  
在equipment中,one-to-many应该有属性cascade=all或者save-update等等。缺省是不级联。
0 请登录后投票
   发表时间:2004-03-15  
我把源代码的SessionImpl类的saveOrUpdate()方法改了一下,加了一个取反符号,级联save可以正常工作,问题这也不是办法啊,还在奋斗中。。。。
if ( persister.hasIdentifierPropertyOrEmbeddedCompositeIdentifier(); ); {
	
	Serializable id = persister.getIdentifier(object);;
	
	[color=red]if ( !persister.isUnsaved(id); ); {[/color]		if ( log.isTraceEnabled(); ); log.trace("saveOrUpdate(); unsaved instance with id: " + id);;
		save(obj);;
	}
	else {
		if ( log.isTraceEnabled(); ); log.trace("saveOrUpdate(); previously saved instance with id: " + id);;
		doUpdate(object, id);;
	}
	
}
0 请登录后投票
   发表时间:2004-03-16  
是unsaved-value的问题,因为ID是整数,缺省值为0,
而unsaved-value缺省为NULL,
将unsaved-value设为0就可以了。如果ID类型为string,就不会有这问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics