public void testUpdateStu() {
Configuration cfg = new AnnotationConfiguration();
SessionFactory sf = cfg.configure().buildSessionFactory();
Session session = sf.openSession();
Student s = (Student) session.load(Student.class,36);
s.setName("zhou");
s.setAge(28);
     
Transaction tx = session.beginTransaction();
//session.update(s);
//session.save(s);
//session.persist(s);
tx.commit();
session.close();
}
问题一本来想做update操作的,但把update注释掉了,为什么还能执行成功,并改变了数据库数据?问题二为什么此代码中的update方法和save方法执行后所得到的结果一样? 问题三此代码中update方法和persist方法的区别?

解决方案 »

  1.   

    public void testUpdateStu() {
    Configuration cfg = new AnnotationConfiguration();
    SessionFactory sf = chinese wholesalers
    ugg).buildSessionFactory();
    Session session = sf.openSession();
    Student s = (Student) session.load(Student.class,36);
    s.setName("zhou");
    s.setAge(28); 
      

  2.   

    1.Transaction tx = session.beginTransaction(); 
    //session.update(s); 
    //session.save(s); 
    //session.persist(s); 
    tx.commit(); 
    session.close()
    你这样,Student 值还能改变?是不是真的啊。
    2.为什么此代码中的update方法和save方法执行后所得到的结果一样?
    离谱,咋可能,如果执行save,程序肯定报错啦,除非你没有设置主键,3.persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
    update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
      

  3.   

    1 你没明白什么叫持久化。hibernate 会自动做数据对比。
    Student s = (Student) session.load(Student.class,36); 
    得到的对象是持久化对象,也就是说hibernate 会检测它,一旦有改变会立即更新到数据库。所以即使不显示地调用
    //session.update(s); 
    //session.save(s); 
    也会写数据库的。
    2
    update 是更新,你数据库要有这条记录。
    save 的话可以更新和保存,在新增对象的时候只能用它。
    对于已经保存了的数据,save于update基本是一样的。
    另外,save 和update都有persist的效果。也就说一个非持久态的对象,在执行save 或update后就会变成持态纳入hibernate容器管理。
      

  4.   

    首先要知道hibernate中对象有三种状态:临时状态、持久状态、游离状态。
    一、当你openSession()后,获取Student对象,这个时候Student对象就处于持久化状态,也就是说这个时候你对这个对象的任何操作都是持久的,都会影响到数据库,如果这时候改变对象的主键就会出错。当session.close()之后,对象处于游离状态,这时候操作对象就不会影响到数据库,除非把这对象再次转换到持久状态。
    二、要注意现在Student对象是持久状态下的对象。save方法不会有区别。除非你再new 一个新的Student对象,这个新的Student对象就是临时状态。设置同样的值再save,这时会保存一个新的Student对象,这个新的Student对象又会转换成持久状态。
    三、persist把实例持久化,主键可能会延迟。update是更新。