小弟一个一对多关系的单向关联关系         <set name="appendent" lazy="true"  cascade="save-update">
            <key column="INFORID"/>
            <one-to-many class="com.job.model.information.Apendent"/>
        </set>一起保存主表和次表时候 这种设置报错 object references an unsaved transient instance
但是
           <set name="appendent" lazy="true"  cascade="all">
            <key column="INFORID"/>
            <one-to-many class="com.job.model.information.Apendent"/>
        </set>就没问题,这是为什么啊

解决方案 »

  1.   

    hibernate都忘了,好几个月没有用。
    帮你顶一下!
      

  2.   

    代码写的不对呗!!save-update级联操作发生在主控方。对主控方操作时才发生级联。你操作的时候估计写了协助方操作。那么save-update就是不行。all检测双方状态。级联操作使用不当反倒影响性能。
      

  3.   


    我是先保存主类在保存子类,当ALL的时候
    Hibernate: insert into JOB_INFORMATION (SID, TITLE, CONTENT, UPDATE_PERSION, KIND, ADDTIME, ID) values (?, ?, ?, ?, ?, ?, ?)
    Hibernate: insert into JOB_APPENDENT (INFORID, NAME, URL, ID) values (?, ?, ?, ?)
    应该没问题吧
      

  4.   

     <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.job.model.information.Information" table="JOB_INFORMATION" dynamic-update="true">
            <id name="ID" type="java.lang.Integer">
                <column name="ID" />
                <generator class="sequence">
                   <param name="sequence">JOB_INFOR_ID</param>
                </generator>
            </id>
            
            <property name="SID" type="java.lang.String">
                <column name="SID"  length="200"/>
            </property>
            
            <property name="TITLE" type="java.lang.String">
                <column name="TITLE" length="200" />
            </property>
            
            <property name="CONTENT" type="java.lang.String">
                <column name="CONTENT" length="1400" />
            </property>
            
            <property name="PERSION" type="java.lang.String">
                <column name="UPDATE_PERSION" length="200" />
            </property>
            
            <property name="kind" type="java.lang.String">
                <column name="KIND" length="200" />
            </property>
            
            <property name="ADDTIME" type="timestamp">
                <column name="ADDTIME"  />
            </property>
           
           <set name="ref" lazy="true" cascade="delete">
                <key column="INFORID"/>
                <one-to-many class="com.job.model.information.Inforef"/>
            </set>
            
             <set name="appendent" lazy="true"   cascade="save-update" >       //all的时候没问题
                <key column="INFORID"/>
                <one-to-many class="com.job.model.information.Apendent"/>
            </set>
            
            
        </class>
    </hibernate-mapping>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.job.model.information.Apendent" table="JOB_APPENDENT" dynamic-update="true">   //这里去掉 dynamic 也一样
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="sequence">
                   <param name="sequence">JOB_APPENDENT_ID</param>
                </generator>
            </id>
            
            <property name="inforid" type="java.lang.Integer">
                <column name="INFORID" />
            </property>
            
            <property name="name" type="java.lang.String">
                <column name="NAME" length="200" />
            </property>
            
            <property name="url" type="java.lang.String">
                <column name="URL" length="200" />
            </property>
           
        </class>
    </hibernate-mapping>
    public String addInfor() throws Exception {
     HttpServletRequest request = ServletActionContext.getRequest(); 



     
     String login = ActionContext.getContext().getSession().get("userName").toString();
             String content = request.getParameter("test");
     String title = request.getParameter("title");
     String sid = JobUtil.getUUID();
     
     
     Information model = new Information();
     model.setSID(sid);
     model.setCONTENT(content);
     model.setPERSION(login);
     model.setTITLE(title);
     model.setKind("0"); //0 没发布 1 发布
     model.setADDTIME(new Date());
     
     
     Set temp = new HashSet();
     
     
     
     //附件处理
     if (uploads != null)
         {  for(int i=0;i<uploads.size();i++)
     {
        String targetDirectory = request.getRealPath("/appendent");
        String targetFileName = generateFileName(fileNames.get(i));  
        File target = new File(targetDirectory, targetFileName);    
        FileUtils.copyFile(uploads.get(i), target);  
        
        
        Apendent app = new Apendent();
        app.setName(fileNames.get(i));
        app.setUrl("/jobmaster/appendent/"+targetFileName);
        temp.add(app);
       
        
        
     }
       
     model.setAppendent(temp);
        
        
     }
        inforService.addInformation(model);  //当级联为SAVE-UPDATE这里就报错了
    return SUCCESS;  
    }
      

  5.   

    知道了,原来底层调用了 getHibernateTemplate().merge(object);