本帖最后由 Resurgam_ 于 2010-08-05 23:47:35 编辑

解决方案 »

  1.   

    save()方法并不立即执行SQL insert语句。只有当Session清理缓存时,才会执行SQL insert语句。如果在save()方法之后,又修改了持久化对象的属性,这会使得Session在清理缓存时,额外执行SQL update语句
      

  2.   

    另外lz还要注意这种情况
    在例如以下代码把Customer游离对象传给session2的save()方法,session2会把它当做临时对象处理,再次向数据库中插入一条Customer记录:Customer customer = new Customer();customer.setName("Tom");Session session1 = sessionFactory.openSession();Transaction tx1 = session1.beginTransaction();session1.save(customer); // 此时Customer对象的ID变为1tx1.commit();session1.close(); // 此时Customer对象变为游离对象Session session2 = sessionFactory.openSession();Transaction tx2 = session2.beginTransaction();session2.save(cutomer); // 此时Customer对象的ID变为2tx2.commit();session2.close();
      

  3.   

    不明白session.save(school);中的school和Person person = new Person();中的person有什么关系
    如果person的改变会影响到school的话,那么当save(school)后没关闭session前再对person作更改的话,那么school也有了更新,而此时的school和数据库还是链接的,处于持久状态中,school的变化数据库是可以监控到的,应该讲是hibernate容器监控到了,然后hibernate容器就会自动将内存中的school和数据库中的school进行同步,所以也就必须的会执行一个Update语句了
         
      

  4.   


    不好意思, 保存的是person这个对象
      

  5.   

    session.getTransaction().commit();没提交之前,当然可以修改了
      

  6.   


    session.beginTransaction();//事物开始
            session.save(person);//当要提交的时候发一条insert语句
            person.setPname("bbbb");//当要提交的时候发一条update语句
    session.getTransaction().commit();session.beginTransaction();//事物开始
            session.save(person);//当要提交的时候发一条insert语句
    session.getTransaction().commit();
    person.setPname("bbbb");//因为session已经提交,所以不会再发了。