以下是USER_INFO表所映射的实体类,是以注释的方式映射的package com.feinno.model.user;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Version;@Entity
@Table(name = "USER_INFO", schema = "CDB")
public class User implements java.io.Serializable { private long id;
private String username;
private Long version;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="USER_INFO_SEQUENCE")
@SequenceGenerator(name="USER_INFO_SEQUENCE",sequenceName="USER_INFO_SEQ",allocationSize=1)
@Column(name="ID")
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
} @Column(name = "USERNAME", length = 20)
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
} @Version
@Column(name="VERSION")
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}        /**
 * 这是在执行saveOrUpdate(user) 以前USER_INFO表中的数据
 * ID USERNAME VERSION
 * 1 AAA 0
 */

User user = new User();
user.setId(1L);
user.setUsername("BBB");
super.getHibernateTemplate().saveOrUpdate(user);

/**
 * 执行以后 USER_INFO表中的数据如下:
 * ID USERNAME VERSION
 * 1 AAA 0
 * 2 BBB 0
 */

/**
 * 本来我是想把id==1的这条数据的USERNAME这个字段更新成BBB,结果并没有
 * 更新成功,反而还插入了一条新的数据,对此很不理解,希望各位大侠们解答一下
                 * 谢谢了 !
 * 
 * 我声明一下:如果把User类中的version属性去掉的话,那么就一切正常
                 * 不明白为什么加上version属性后,就不能更新了
 */
先谢谢各们高手了

解决方案 »

  1.   

    super.getHibernateTemplate().saveOrUpdate(user);
    应该调用Update方法吧·?··!···
      

  2.   

    ..保存就用save吧 ,更新就update,这样好控制,只要能解决问题就行,别把自己搞晕了,
      

  3.   

    根据自己的喜好吧 不过最好还是单独使用 也可以直接使用hql或sql语句
      

  4.   

    因为你这里的user是通过创建新对象生成的:
    User user = new User();如果你要update的话,那么应该先通过get方法,取出id=1的那个user,
    然后修改它的名称,再调用:
    super.getHibernateTemplate().saveOrUpdate(user);
    此时,系统会自动调用update方法。
      

  5.   

    啥叫Version ?
    如果你更新的version 比现有的高,那么一点问题没有了。
    另外,更新应该是先load,然后set,最后update才行,你的这个做法不是正确的方法。
      

  6.   

    User user = new User();
    user.setId(1);
    super.getHibernateTemplate().saveOrUpdate(user);
    //如果数据库中有id为1的记录,而且不加version这个映射的话,这样是可以直接更新的
      

  7.   

    saveOrUpdate(user);
    先select根据你USER的ID查询,如果有数据就UPDATE
    否则 insert