我就是做了一对多和多对一的双向关联,我关联查询的时候会报错。这个异常我搜过的。但是还是没有解决问题。异常如下:
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - rollback
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - re-enabling autocommit
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - rolled back JDBC Connection
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
21:57:42.218 [http-8080-1] DEBUG org.hibernate.impl.SessionImpl - disconnecting session
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
2009-4-24 21:57:42 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet xiaoyuBlog threw exception
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.blog.blog.domain.User
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:430)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:110)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1728)
at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1699)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1589)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)下面是我的HBM配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
package="org.blog.blog.domain">
<class name="Article" table="article" dynamic-update="true" >

<id name="id">
<generator class="native"/>
</id>
<property name="title" column="TITLE"/>
<property name="content" column="CONTENT"/>
<property name="createDate" column="CREATE_DATE"></property>
<many-to-one name="createUser" class="User">
         <column name="user_id" not-null="true"/>
        </many-to-one>
</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">
<hibernate-mapping 
package="org.blog.blog.domain">
<class name="User" table="user" dynamic-update="true" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="NAME"/>
<property name="password" column="PASSWORD"/>
<property name="email" column="EMAIL"></property>
<property name="phone" column="PHONE"></property>
<bag name="articles" table="article" inverse="true" lazy="false" cascade="all">
        <key column="user_id"/>
           <one-to-many class="Article" />
        </bag>
</class>
</hibernate-mapping>我配置的文件,我WEB层调用的方法是:
User user=(User)request.getSession().getAttribute("user");
List<Article> articles=articleManager.findByProperty("createUser", user);
我提供了getter和setter方法的。但是总报这个错误。在这个地方也报:
User user=(User)request.getSession().getAttribute("user");
article.setCreateUser(user);
article.setCreateDate(new Date());
articleManager.save(article);
我很想彻底解决这个问题,它的意思就是麽有把对象持久,user对象没有持久就保存。

解决方案 »

  1.   

    你看看你的需要持久化的对象User是否实现接口:Serializable没有!如果没有!那可能就会出现这个问题了!
      

  2.   

    实体类和字段有冲突?是什么意思?是名称写错了?是不是<bag name="articles" table="article" inverse="true" lazy="false" cascade="all">
            <key column="user_id"/>
              <one-to-many class="Article" />
            </bag> 
    我建立的SQL语句:
    DROP TABLE IF EXISTS `article`;
    CREATE TABLE `article` (
      `ID` bigint(20) NOT NULL AUTO_INCREMENT,
      `TITLE` varchar(255) DEFAULT NULL,
      `CONTENT` varchar(255) DEFAULT NULL,
      `CREATE_DATE` datetime DEFAULT NULL,
      `user_id` bigint(20) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `FKD458CCF6617371DA` (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;#
    # Dumping data for table article
    #
    /*!40000 ALTER TABLE `article` DISABLE KEYS */;/*!40000 ALTER TABLE `article` ENABLE KEYS */;#
    # Table structure for table user
    #
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `ID` bigint(20) NOT NULL AUTO_INCREMENT,
      `NAME` varchar(20) DEFAULT NULL,
      `PASSWORD` varchar(20) DEFAULT NULL,
      `EMAIL` varchar(255) DEFAULT NULL,
      `PHONE` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      

  3.   

    还有个问题就是,我用spring mvc的表单,比如说在编辑中,我需要在进入编辑页面控制器中把article存入session中,那么提交控制器方法,就应该取到ID,这样可以再提交控制器得到相同的ID对象的article可以进行动态更新,但是却得不到id,代码如下:
    /**
     * 进入编辑文章控制器
     * @return
     */
    @RequestMapping(value="/system/editArticle.do",method=RequestMethod.GET)
    public String setEditArticle(Long articleId,ModelMap model){
    Article articleEdit=articleManager.get(articleId);
    model.addAttribute("articleEdit", articleEdit);
    return "editArticle";
    }

    /**
     * 提交编辑文章控制器
     * @return
     */
    @RequestMapping(value="/system/editArticle.do",method=RequestMethod.POST)
    public String editArticle(@ModelAttribute Article articleEdit,ModelMap model,SessionStatus status){

    articleEdit.setCreateDate(new Date());
    articleManager.update(articleEdit);
    status.setComplete();
    return "redirect:/system/index.do";
    }做了annotation的配置的:@SessionAttributes("articleEdit")
      

  4.   

    把cascade属性修改为"save-update"
      

  5.   

    我的问题也是一样的啊,纠结啊
    es:      object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization
        object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.OrgnizationFile:  org/hibernate/engine/ForeignKeys.java
    Line number:  243
    Stacktraces
    org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization    org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
        org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
        org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
        org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
        org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
        org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
        org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
        org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
        $Proxy14.save(Unknown Source)
        com.yy.action.OrgAction.save(OrgAction.java:101)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      

  6.   

    我也是啊:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: net.demo.entiry.RoomType
      

  7.   

    这个问题的原因是在双向多对一关系中,就比如student和teacher。在保存student时候你没有先保存teacher,这样hibernate在执行save方法时会发现你的setTeacher(teacher)里面teacher是空值因而报异常。网上有的做法是将级联擦做cascade设置为all。你可以试试。
      

  8.   

    我今天晚上也遇到这个问题,是在个人信息修改时出错的,看了很多这样子的解答,但是还是不行。但是后来我解决了原来我获取不到角色ID,用户的信息修改时就报错。我就在角色的dao层里面写个根据角色名称来获取角色列表的方法,即roleService.findByRname(rname),这样角色ID就可以像下面这样获取到了。
    int rid = roleService.findByRname(rname).get(0).getRid();
    然后再把该ID用set给role       
     即role.setRid(rid);
    运行,就OK了
      

  9.   

    这问题也遇到好几次,但每次都稀里糊涂的过去了。这次的问题纠结了我一个多小时,数据是从jsp传过来的,然后进行创建。这个时候就报错。后来经过debug调试后,反正挺费精神的。发现页面传过来的对象(obj)中,有个外键对象应该是null,但它确不是null,而是个空对象,这样我最后create(obj)时,报出此错误。郁闷至极
      

  10.   


    如果又不想级联删除,怎么办哇好吧,可以用hibernate的Cascade
    import org.hibernate.annotations.Cascade;
    import org.hibernate.annotations.CascadeType;
    ...
    @Cascade({CascadeType.SAVE_UPDATE})
      

  11.   

    如果是你这样比方的话。。我的teacher表里有值。我想给student加数据 写级联以后 他又会去多生成一个新的teacher