收录日期:2020/10/31 00:53:47 时间:2016/07/16 15:33:55 标签:Web 开发
我在做一个“购物车项目”的“用户管理”模块的“修改用户信息”时,发现修改过用户信息后,点击提交,后台用System.out.println()语句,打印出来的用户信息是修改成功的(并且控制台也有update ORACLE 的sql语句输出),可是到数据库中查看,数据却没有更新,不知道怎么回事,搞了几天也没搞出来原因,网上也查不到,郁闷啦。。。 

public ActionForward modify(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-*.xml");
IUserBiz service=(IUserBiz) ac.getBean("service");
IUserBiz service2=(IUserBiz)ac.getBean("service");

UserActionForm userForm = (UserActionForm)form;
Contact contact = new Contact();
User user = new User();

HttpSession session = request.getSession();
System.out.println("userid: "+session.getAttribute("userid"));
System.out.println("after printing userid");

 if(session.getAttribute("userid")==null){
     return mapping.findForward("fail");
    }
 
//把取到的数据封装成 User 和 Contact
 try{
  BeanUtils.copyProperties(contact, userForm);
BeanUtils.copyProperties(user, userForm);
System.out.println("user after BeanUtils.copyProperties(): "+user);
System.out.println("contact after BeanUtils.copyProperties(): "+contact);

contact.setUser(user);
user.setContact(contact);
 }catch(Exception e){
 e.printStackTrace();
 }

 //调用 update方法,更新数据库  
try{
service.modifyUser(user);
service2.modifyUser(contact); 
System.out.println("user after modify(): "+user);
System.out.println("contact after modify(): "+contact);

System.out.println(contact.getStreet1());
System.out.println(contact.getStreet2());
System.out.println(user.getPassword());

}catch(Exception ex){
ex.printStackTrace();
return mapping.findForward("systemError");
}

System.out.println("----------------just BEFORE return mapping.findForward()---------------------");
System.out.println(contact.getStreet1());
System.out.println(contact.getStreet2());
System.out.println(user.getPassword());
return mapping.findForward("modify_success");

}
各位朋友指点下呀,谢谢!!!!!!!!

不是很会,


但是好像并没有调用 update方法,更新数据库 

LZ再检查一下update方法

事务没有提交
你的habernate的配置文件里的列名可能跟你的实体字段名不一样,所以他就没有更新了!你检查一下
打印出来的用户信息是 对象的属性信息,而不是数据库的信息。

把数据库操作类的代码贴出来看看。
你在数据更新的类里面有这个语句么?
conn.commit();//conn是连接
如果没有,就加上,oracle,做数据更新和删除都需要提交事务,呵呵
不晓得能否给你提供帮助。。。。
orale数据库不是自动提交事物的……不想mysql,默认是自动提交的
提交一下事务- -||

解决了记得回复。
lz应该是忘了提交了吧。虽然不知道你是用了什么框架,但既然控制台打印正确,就说明数据没有提交到数据库。如果是使用SSH的话,就不需要写提交代码了。Spring会自动处理。
1. 如果是手动写的事物处理,那记得提交事务。

2. 做完更新,在程序里面在从数据库里面取出刚才修改的信息,看看修改了吗。记得,是重新从数据库里面读一遍。
	public ActionForward modify(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-*.xml");
IUserBiz service=(IUserBiz) ac.getBean("service");

UserActionForm userForm = (UserActionForm)form;
Contact contact = new Contact();
User user = new User();

HttpSession session = request.getSession();
System.out.println("userid: "+session.getAttribute("userid"));
System.out.println("after printing userid");

if(session.getAttribute("userid")==null){
     return mapping.findForward("fail");
    }

//把取到的数据封装成 User 和 Contact
 try{
  BeanUtils.copyProperties(contact, userForm);
BeanUtils.copyProperties(user, userForm);
System.out.println("user after BeanUtils.copyProperties(): "+user);
System.out.println("contact after BeanUtils.copyProperties(): "+contact);

contact.setUser(user);
user.setContact(contact);
 }catch(Exception e){
 e.printStackTrace();
 }

 //调用 update方法,更新数据库  
try{
service.modifyUser(user,contact);
System.out.println("user after modify(): "+user);
System.out.println("contact after modify(): "+contact);

System.out.println(contact.getStreet1());
System.out.println(contact.getStreet2());
System.out.println(user.getPassword());

}catch(Exception ex){
ex.printStackTrace();
return mapping.findForward("systemError");
}

System.out.println("----------------just BEFORE return mapping.findForward()---------------------");
System.out.println(contact.getStreet1());
System.out.println(contact.getStreet2());
System.out.println(user.getPassword());
return mapping.findForward("modify_success");

}

引用 2 楼 xiaohuanjie 的回复:
不是很会,


但是好像并没有调用 update方法,更新数据库

LZ再检查一下update方法


public void updateUser(User user, Contact contact) throws DataAccessException{
HibernateTemplate ht=getHibernateTemplate();
ht.update(user);
ht.update(contact);
}
引用 4 楼 zhaoxisun 的回复:
你的habernate的配置文件里的列名可能跟你的实体字段名不一样,所以他就没有更新了!你检查一下


我的register()就可以,证明实体字段名没问题,谢谢!

public ActionForward register(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-*.xml");
IUserBiz service=(IUserBiz) ac.getBean("service");

//从form中取到数据
UserActionForm userForm=(UserActionForm) form;
User user=new User();
Contact contact=new Contact();

//把取到的数据封装成 User 和 Contact
try{
BeanUtils.copyProperties(user, userForm);
BeanUtils.copyProperties(contact, userForm);

contact.setUser(user);
System.out.println(contact.getUser().getUserid());

}catch(Exception ex){
ex.printStackTrace();
}

//调用 register(User user, Contact contact)方法,存入数据库
try{
service.register(user, contact);
}catch(Exception e){
e.printStackTrace();
return mapping.findForward("register_fail");
}
return mapping.findForward("register_success");
}
register(User user, Contact contact)方法保存数据的时候出了问题,你在register(User user, Contact contact)方法中设置断点看看情况,具体没有全部的代码不好说问题所在,另外BeanUtils.copyProperties实践证明这个方法有点问题,不建议使用!
看看UPDATE语句 
 可能是SQL问题 或者 事务没提交
你这样代码发出来根本说明不了什么问题。有错误信息没?
debug一下
应该是事物没有提交
多谢几位!

1、register()方法没有任何问题,本贴说的问题是modify()方法
2、没有任何错误或者异常抛出
3、debug也发现不了任何问题
断断续续看了7 8次啦,也许是想的太多了,更重要的是受各位的启发,终于想到了问题可能所在:

我这里有两个实体类:user, contact_info, 在oracle中也就对应了两张表:
users <---> contact_info

users 中的primary key 是 userid, 同时也是 contact_info的foreign key, 而contact_info的primary key 是 contact_id

在该用户管理模块中只显性的涉及到了 除 contact_id外的其他所有属性,而contact_id是由sequence自动生成的, 因此,在register时,成功存入数据库,而在modify时,因为没有contact_id的值,所以:

update contact_info set ... where contact_id=?

就会因为contact_id = null而回滚,造成数据库里没有更新。

原来,我的userForm中压根就没有 contact_id 因此没能把前台页面的 contact_id 传到 action中,造成数据库里没有更新。

谢谢几位朋友!
对了,我本是英文专业出身,工作了几年,始终难以抑制对计算机及这个行业的兴趣,故想转行进入IT业,由于要掌握的知识很多,故一路走来不断的遇到各种各样的问题,很想结识些志同道合的朋友,也好在求知的路上不再孤单,呵呵,如有兴趣,可加我QQ: 346775405

为了早日做上自己想做的工作,加油!
学习
先测试你的service能不能用

How to use enum type in ActiveX control 在那里可以下载VB6的SP5补丁 commondialog的初始位置可控吗? tomcat4.0的问题!!十万火急!!!!! 关于C语言中文件结束符的问题 显卡驱动程序列举了些什么数据啊?我看不懂。高手大体介绍一下。让俺长长见识。 怎样用文本编一个点击图片的统计。 关于《高级程序员考试》 用ODBC,打开一个数据集,然后调用AddNew()添加新记录,在Access上一点问题都没有,但在SQL Server上却提示记录集只读,不能添加,可能是 请各位能否推荐vc从入门到精通的一些书 我的显卡是TNT的。TNT显卡完成SETPIXEL功能的函数指针是在什么时候赋给SETPIXEL函数的?记录在WINDOWS中了吗? 来者有分.... 怎么 在标签里不可以所有onmouse处理事件? 怎样读出dataset中某记录的某字段的值? 高手快来:350分回答这个问题 用TURBO C 编一个WINDOWS窗口容易吗? 请教高手,我在1024*768分辨率下打印VB窗体,在屏幕上看起来很正的东西打印到纸上反而偏了,不知是什么原因。 怎么 在标签里不可以所有onmouse处理事件 高手快来:350分回答这个问题 2000 server双网卡+ADSL怎么配置软路由呢? 终于进论坛了!好不容易啊! 创建一个新的按钮 我的xp死机后,重启不能开机 一个奇怪的问题:win98下不能取消共享!急盼各位解答! dilphi中怎样建交叉报表? 天哪,为什么以前参与的问题都不见了????? 奇怪的时间问题,大家遇到过没有?................进来看看吧..:-) php连接MSSQL(紧急!) 紧急求助!!! 很菜鸟的问题