日期:2014-05-17  浏览次数:20792 次

修改功能实现问题
异常如下:
严重: Servlet.service() for servlet default threw exception
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:654)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:650)
at com.people.dao.UserDAOImpl.updateI(UserDAOImpl.java:28)
at com.people.service.UserServiceImpl.updateInterviewer(UserServiceImpl.java:38)
at com.people.action.interviewer.UpdateInterviewerAction.execute(UpdateInterviewerAction.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

问题是要实现一个修改的功能,表中有好多字段,但只修改其中的几个,每次在提交的时候都是直接在数据库中又多加了一条记录,而并非是修改
action:
  public String execute() throws Exception{
User user = new User();

user.setUsername(username);
user.setPassword(password);

System.out.println(user.getUsername());
userService.updateInterviewer(user);

return SUCCESS;
}
updateInterviewer方法:
  public void updateInterviewer(User user){

userDAO.updateI(user);
}
updateI方法:
  public void updateI(User user) {

this.getHibernateTemplate().update(user); 
}
有人说是数据库中主键的设成自增什么的,还有映射文件那我是这样写的<generator class="identity"></generator>,不知道有没有什么问题?求教啊

------解决方案--------------------
在hbm里,要将设置属性dynamic-update=true,这样的话,就知更新你修改的数据了。你修改试一下.
------解决方案--------------------
不能每次都new一个新的吧!应该是先从数据库查出来,然后修改相应属性,然后再update
------解决方案--------------------
<generator class="identity"> 这个只适用于mysql 和 sqlserver 
如果是oracle 应该是配置 
<generator class="sequence">
<param name="sequence">序列名</param>
 </generator>
另外 主键不应该是user的具体数据,只是一个编号
在你的代码中 user是新建的 也就是说没有id值
你用的是代理对象实现的update
代理会检测id是否存在 不存在则新增
so
你应该在修改的时候把id也同设置,这样才会去修改
------解决方案--------------------
你这个user对象的id是否在数据库中有记录,如果没有记录hibernate认为找不到就执行添加的。
 你看下控制台打印的hibernate 的sql语句你就会明