现在有userinfo用户表和departmentinfo部门表,现在userinfo表中有外键depid(departmentinfo的主键);在hibernate生成实体映射时,userinfo类中出现了departmentinfo: Departmentinfo这个属性;实现userinfo的修改:  Userinfo userinfo=new Userinfo(); //创建user
 int userId=Integer.parseInt(request.getParameter("userId")); //获取ID
 String username=request.getParameter("username"); //获取name
 String password=request.getParameter("password"); //获取password
 Departmentinfo departmentinfo=new Departmentinfo();
 departmentinfo.setDepartmentname(request.getParameter("departmentinfo"));   //获取部门对象
 
userinfo.setUid(userId);           
userinfo.setUsername(username);
userinfo.setPassword(password);
userinfo.setDepartment(departmentinfo);
   
super.getHibernateTemplate().update(userinfo);
现在报的错误:
严重: Servlet.service() for servlet action threw exception
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.pojo.Departmentinfo
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1997)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2371)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2307)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2607)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:654)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:650)
at com.test.dao.impl.UserinfoDaoimpl.Update(UserinfoDaoimpl.java:65)
at com.test.biz.impl.UserinfoBizimpl.Update(UserinfoBizimpl.java:45)
at com.test.web.UserinfoAction.update(UserinfoAction.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
哪位大哥,大姐帮忙告诉我怎么解决,有代码更好!!!!!!

解决方案 »

  1.   

    我想是不是你的映射文件(Userinfo.hbm.xml)里面的关联关系没有配置。
    或者还缺少一个属性casecade="save-update"
      

  2.   

    我设置了 all<hibernate-mapping>
        <class name="com.test.pojo.Userinfo" table="userinfo" schema="dbo" catalog="Userinfo_DB">
            <id name="uid" type="java.lang.Integer">
                <column name="uid" />
                <generator class="native" />
            </id>
            <many-to-one name="departmentinfo" class="com.test.pojo.Departmentinfo" fetch="select" >
                <column name="depid" />
            </many-to-one>
            <property name="username" type="java.lang.String">
                <column name="username" length="20" />
            </property>
            <property name="password" type="java.lang.String">
                <column name="password" length="20" />
            </property>
            <set name="userinfoRoleses" inverse="true" cascade="all" >
                <key>
                    <column name="uid" />
                </key>
                <one-to-many class="com.test.pojo.UserinfoRoles" />
            </set>
        </class>
    </hibernate-mapping>
      

  3.   


    设置成all ,和save-update  应该没多大区别吧
      

  4.   

    现在hibernate不是都用annotation的嘛
      

  5.   

    <many-to-one name="departmentinfo" class="com.test.pojo.Departmentinfo" fetch="select" >
    人员和部门的关联关系你没设置all啊
      

  6.   

    hibernate 可以自动生成实体类和xml文件
    还有你实体可以封装到struts的form中
    Department用的外键类
    Departmentinfo departmentinfo=new Departmentinfo(); 
     departmentinfo.setDepartmentname(request.getParameter("departmentinfo")); //获取部门对象
    这里得到的不是部门对象
    只是一个departmentinfo名字
    要通过方法去查找对象