我的问题和这个比较类似: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();
}
}
}
******************************************************************************
就是在一对多关系中,如果一方的数据不需要插入(已经存在),而是只插入多方数据(插入存在一方的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();
}
}
}
******************************************************************************
解决方案 »
- servlet做个公开的接口
- unix下如何关闭状态为CLOSE_WAIT的线程,不重启服务的情况下
- 学习JSP的时候看见这个表达式,求解意思:${pageScope.item}
- 2个异常,让我眼花缭乱,高手帮忙解决!
- 问一个CFile创建目录的奇怪问题
- 急死了,软件公司给的一个面试题,明天就要交,根据左边主下拉框的选项内容(年、季、半年、月、旬、日),进行右边相应日期范围下拉框的
- 怎样设置session失效后弹出的提示信息或跳转页面
- 在jsp中使用JavaBean的简单问题
- 请教各位DX一个很棘手的问题,望各位不惜赐教!!
- SSM中把使用查询语句后的结果集进行了改变,要传到easyui前端的filed,怎么做
- 为什么我的分页程序特别慢
- 如何把下面四条查询语句变成一条sql语句
class= "hci.hj.vo.login.Rsuser "
insert= "false "
update= "true "
>
你book表里的那个外键是不是不允许为null呀?你把insert="false"改成insert="true".要是行的话告诉一声,我也是猜的!!!!
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)
……
Query query=session.createQuery( "FROM Rsuser m where userId= "+ " ' "+username+ " ' ");
不知道是否真的取到的是你数据库中存的,也许取到的是个null
我用下面测试了,是有值的:
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的多对多就没有插入数据!
我这里实际情况是 同时做一个一对多,和一个多对多