日期:2014-05-18  浏览次数:20679 次

hibernate的one-to-many和many-to-one的级联保存问题
在我的项目中,有一个User类和一个Group类,两者的关系式1-N,user.hbm.xml配置文件中的many-to-one内容如下:<many-to-one name="group" 
 class="com.whir.model.Group"
 column="groupid"
 insert="true"
 update="true"
 cascade="none"
 outer-join="auto"
/>
group.hbm.xml中one-to-many内容如下: 
                          <set name="users" 
 schema="ezoffice"
 lazy="true"
 inverse="true"
 table="t_user"
 cascade="all"
 sort="unsorted">
<key column="groupid"></key>
<one-to-many class="com.whir.model.User"/>
     </set>
然后我在函数中保存group,在保存group的时候也想把user的一个对象保存到数据库中:函数代码如下:
                 DB db = new DB();
User u1 = new User();
u1.setUsername("default_u1");
u1.setPassword("default_u1pwd");
u1.setAge(23);
u1.setPhone("sdfsd");
u1.setSex("男");
u1.setRegisterdate(new Date(System.currentTimeMillis()));

Group group = new Group();
group.setGroupname("default_groupname");
group.setGroupdesc("default_groupdesc");
group.getUsers().add(u1);
u1.setGroup(group);
db.save(group);

在运行的时候group能保存,但是u1没有保存,报错内容如下:

[20/03/13 03:13:32:032 CST] ERROR impl.SessionImpl: Could not synchronize databa
se state with session
net.sf.hibernate.HibernateException: SQL insert, update or delete failed (row no
t found)
        at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatche
r.java:25)
        at net.sf.hibernate.persister.EntityPersister.update(EntityPersister.jav
a:688)
        at net.sf.hibernate.persister.EntityPersister.update(EntityPersister.jav
a:641)
        at net.sf.hibernate.impl.ScheduledUpdate.execute(ScheduledUpdate.java:52
)
        at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2382)
        at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2336)
        at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2204)
        at com.whir.util.DB.save(DB.java:16)
        at com.whir.action.GroupAction.adddefault_group_user(GroupAction.java:13
3)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.struts.actions.DispatchAction.disp