我的问题和这个比较类似:http://www.itpub.net/showthread.php?s=&threadid=702915&perpage=10&pagenumber=1 
就是在一对多关系中,如果一方的数据不需要插入(已经存在),而是只插入多方数据(插入存在一方的id),
在这种情况下,多方中关于一方的外键id始终为空,没有值,不报错,不知道为什么?
   但是测试具体是:
   表user(uid,uname)与book(bid,uid,bname)是一对多关系(具体是一对二),其对应的实体对象是 Rsuser和Rsbook,现在我只想把user的uid 插入book中,因为user中已经存在一个记录(jj,123),现在用户上传时即上传程序upload.java运行时,程序从cookie中读到用户登录的用户username,然后我用下面的代码取得了user对象:
******************************************************************************
 Session session = HibernateSessionFactory.getSession();
      Transaction tx = session.beginTransaction();
     Query query=session.createQuery("FROM Rsuser m where userId="+"'"+username+"'");
     List userlist=query.list();    
     Rsuser user =(Rsuser)userlist.get(0);
******************************************************************************
再 用
******************************************************************************
rsbooks = new Rsbook[booknum];
…………
 for(int k=1;k<=al.size();k++)
  { rsbooks[k-1].setRsuser(user);             }******************************************************************************
绑定到rsbook对象上再用
******************************************************************************
 ……
 rsbooks = new Rsbook[booknum];
bookdaos[0].save(rsbooks[0]);           
bookdaos[1].save(rsbooks[1]);
******************************************************************************从多方来保存对象,但是结果是Rsuser对象所对应的uid,不能插入到rsbook(rid,uid,bookname)中---即数据结果是(1,null,book1),不知道为什么?console的输出结果是******************************************************************************insert into rsbook(rid,bookname)values(?,?)******************************************************************************
就没有对应的uid字段另外,我实体类和hbm.xml,RsbookDAO 是这么写的
Rsuser .java
******************************************************************************
public class Rsuser  implements java.io.Serializable {     private long uid;
     private String uname;
     private Set rsbooks = new HashSet();  
 ……
//其余get/set方法略,自动生成的 ******************************************************************************Rsuser .hbm.xml
******************************************************************************
<hibernate-mapping>
    <class name="hci.hj.vo.login.Rsuser" table="rsuser">
        <id name="uid" type="long"  unsaved-value="any">
            <column name="UID" />
            <generator class="native" />
        </id>
 <set name="rsbooks" 
        table="rsbook"
        cascade="all" 
        inverse="true"
        ><key column="UID"></key>
        <one-to-many class="hci.hj.vo.rsbook.Rsbook"/>
        </set>
……
******************************************************************************
Rsbook.java
******************************************************************************public class Rsbook  implements java.io.Serializable {     private long bid;
//     private long uid;去到这个了
     //与rsuser是多对一的关系
     private Rsuser rsuser;    
    
     private String bookName;
******************************************************************************Rsbook .hbm.xml
******************************************************************************
hibernate-mapping>
    <class name="hci.hj.vo.rsbook.Rsbook" table="rsbook" catalog="treeview">
        <id name="bid" type="long">
            <column name="BID" />
            <generator class="native" />
        </id>
        <!-- 
        <property name="uid" type="long">
            <column name="UID" />
        </property>
         -->
 <many-to-one name="rsuser" 
        class="hci.hj.vo.login.Rsuser"
            insert="false"
         update="true"      
         >
……
******************************************************************************RsbookDAO 
******************************************************************************
public class RsbookDAO { public void save(Rsbook rsbook)
{
try
{
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
session.save(rsbook);
tx.commit();
session.close();
}catch(Exception ex)
{
ex.printStackTrace();
}

}
}
******************************************************************************

解决方案 »

  1.   

     <many-to-one   name= "rsuser "   
                    class= "hci.hj.vo.login.Rsuser " 
                            insert= "false " 
                      update= "true "             
                      > 
    你book表里的那个外键是不是不允许为null呀?你把insert="false"改成insert="true".要是行的话告诉一声,我也是猜的!!!!
      

  2.   

    太大意了,的确是 insert=   "false   "  要改成true;现在console打印出来的语句终于有了这个uid  insert rsbook (bid,uid,bname)values(?, ? ,?)但是查询数据库表rsbook中uid值仍然是空的!而且报错:
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hci.hj.vo.login.Rsuser
    at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
    ……
      

  3.   

    object references an unsaved transient instance - save the transient instance before flushing
      

  4.   

    你确定你取到的user在数据库中实实在在的存在吗?你把你取到的user在后台打印一下,看看情况。
    Query   query=session.createQuery( "FROM   Rsuser   m   where   userId= "+ " ' "+username+ " ' "); 
    不知道是否真的取到的是你数据库中存的,也许取到的是个null
      

  5.   

       
    我用下面测试了,是有值的:
    String userid = rsbooks[k-1].getRsuser().getUserId();
                  System.out.println( "2 userid: "+userid+"k"+k+"ggggg");
                    System.out.println("bookname["+(k-1)+"]: "+rsbooks[k-1].getBookName());现在改正了一部分错误,
    Session session = HibernateSessionFactory.getSession();
          Transaction tx = session.beginTransaction();
         Query query=session.createQuery("FROM Rsuser m where userId="+"'"+username+"'");
         List userlist=query.list();    
         Rsuser user =(Rsuser)userlist.get(0);
          session.update(user);     
         System.out.println("uid :"+user.getUid());
            System.out.println("username: "+user.getUserId()); 在最后增加了:[color=#FF0000]user.getRsbooks().add(rsbooks[0]);
                user.getRsbooks().add(rsbooks[1]);
                session.save(user);

     bookdaos[0].save(rsbooks[0]);             
            bookdaos[1].save(rsbooks[1]);[/color]
    但是 结果是 rsuser 和 rsbook 一对多的数据插入了一半,但是rsbook 与rsbooktag的多对多就没有插入数据!
       我这里实际情况是 同时做一个一对多,和一个多对多
      

  6.   

    已经解决,是我没有弄清楚在hibernate中cascade的真正涵义,当多个实体一起cascade时,报存第一个对象就可以了;