关于many-to-one的添加和修改的问题,急急急~~~~

LBreathy 2009-11-11 09:04:09
小弟最近在练习SSH的集成,在做一个demo,可是在做的过程中发现了一个问题,就是,在数据库中有一个用户表,还有一个group表,用户表中的groupID不能为空,并且和group表中的ID为主外键关系(group表为主键),并在用户表中的groupID设了默认值为1,可是当添加的时候,抛异常为SQLException:insert失败,不能将users.groupID的null值插入users表中,于是,我就先查出了group中的ID,然后把group的对象放入到了User对象中,就可以添加进去了,感觉问题是解决了,可是当修改用户的时候又出现了同样的问题!于是Users.hbm.xml在配置文件中加入了
<many-to-one name="relation" class="com.product.entity.Relation" cascade="save-update">
<column name="u_relation" />
并且在update.jsp中加入了一个
<html:hidden property="user.group"/>
的cascadi属性,可是还是不行,抛得异常为:java.lang.IllegalArgumentException: Cannot invoke com.product.entity.Users.setRelation - argument type mismatch

不知道该怎么解决了,既然加了关系不就可以不需要添加groupID了么?我也给groupID设为默认值了,为什么在更新的时候还是不行?难道还要根据用户原有的id查出用户原来的groupID,在更新的时候再set进去么?有没有更好的解决方案啊?希望各位大侠们帮我解决下这个困惑!!!小弟是自学的,希望各位不要嫌弃小弟的问题简单!!!
...全文
204 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
LBreathy 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangguoyanjian 的回复:]
<html:hidden property="user.group"/>
这个不能这样写的,就算这样写,jsp没有异常,它不能把直绑定的,标签里是不能放对象的。


如果你要修改外键表的值的话,就要把主键表的那个条记录查询出来,
<html:hidden property="user.group.groupId"/>
Users user=userForm.getUser();
Group group=getGroup(user.group.groupId);//自己写一个方法,根据id返回一对象

suer.setGroup(group);//设置外键的值

this.userBiz.updateUser(user);//执行修改操作


不知道我这样说,楼主明白否?


[/Quote]

明白了,我会再试试的,这两天家里有些事情忙的没上来看看,谢谢各位了!
道光2008 2009-11-11
  • 打赏
  • 举报
回复
修改:
<set name="userses" inverse="true" cascade="all">
<key>
<column name="u_groupID" />
</key>
<one-to-many class="com.product.entity.Users"/>
</set>[/code]
中cascade="save-update"删除
<many-to-one name="relation" class="com.product.entity.Relation" >
<column name="u_relation" />
LBreathy 2009-11-11
  • 打赏
  • 举报
回复
补充下,在group.hbm.xml中有[code=MML]
<set name="userses" inverse="true">
<key>
<column name="u_groupID" />
</key>
<one-to-many class="com.product.entity.Users"/>
</set>[/code]
wangguoyanjian 2009-11-11
  • 打赏
  • 举报
回复
<html:hidden property="user.group"/>
这个不能这样写的,就算这样写,jsp没有异常,它不能把直绑定的,标签里是不能放对象的。


如果你要修改外键表的值的话,就要把主键表的那个条记录查询出来,
<html:hidden property="user.group.groupId"/>
Users user=userForm.getUser();
Group group=getGroup(user.group.groupId);//自己写一个方法,根据id返回一对象

suer.setGroup(group);//设置外键的值

this.userBiz.updateUser(user);//执行修改操作


不知道我这样说,楼主明白否?

kky2010_110 2009-11-11
  • 打赏
  • 举报
回复
cascade="save-update"
去掉行不?这个是放在父端得one那端
ABAP1314 2009-11-11
  • 打赏
  • 举报
回复
你也没获取 前提数据啊··直接把 UserForm 里的user 给 update进去了?
LBreathy 2009-11-11
  • 打赏
  • 举报
回复
请大家指教!~!~
LBreathy 2009-11-11
  • 打赏
  • 举报
回复
找着楼上的改了,可是还是有异常
严重: Servlet.service() for servlet action threw exception
com.microsoft.sqlserver.jdbc.SQLServerException: 不能将值 NULL 插入列 'u_relation',表 'pro_manager.dbo.users';列不允许有空值。UPDATE 失败。


如果不把
<html:hidden property="user.group"/>
去掉的话
异常为:严重: Servlet.service() for servlet action threw exception
java.lang.IllegalArgumentException: Cannot invoke com.product.entity.Users.setRelation - argument type mismatch


附上action的代码:

public ActionForward toEdit(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
UserForm userForm =(UserForm) form;
String sid=request.getParameter("id");
int id=Integer.parseInt(sid);
Users user=this.userBiz.findUserById(id);
userForm.setUser(user);
return new ActionForward("/WEB-INF/user/update.jsp");
}
public ActionForward doEdit(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
UserForm userForm =(UserForm) form;
Users user=userForm.getUser();
this.userBiz.updateUser(user);
try {
response.sendRedirect("user.do?op=doIvalid");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;



81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧