1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  void  addStudent(){
         sessionFactory= new  AnnotationConfiguration().configure().buildSessionFactory();
         Session session=sessionFactory.getCurrentSession();
         session.beginTransaction();
         Student student= new  Student(  "李四" 34 );
         session.save(student);
         student.setName( "王五" );
         Iterator<Student> iterator=(Iterator<Student>) session.createQuery( "from Student" ).iterate();
             while (iterator.hasNext()){
                 System.out.println(iterator.next().toString());
             }
         
         session.getTransaction().commit();
     }

注意

1
2
session.save(student);
student.setName( "王五" );

session持久化了实体后,只是写入了session缓存中,commit前并没有写入数据库中,此时再改变

实体,保存到数据库的实体为修改过的实体。

wKiom1g4CVqxPk7FAAAU70Hay9U234.png-wh_50

1
2
3
4
5
6
7
8
9
10
11
12
13
public  static  void  updateStudent(){
         sessionFactory= new  AnnotationConfiguration().configure().buildSessionFactory();
         Session session=sessionFactory.getCurrentSession();
         session.beginTransaction();
         Student student=(Student) session.get(Student. class 2 );
         student.setName( "update" );
         Iterator<Student> iterator=(Iterator<Student>) session.createQuery( "from Student" ).iterate();
             while (iterator.hasNext()){
                 System.out.println(iterator.next().toString());
             }
         
         session.getTransaction().commit();
     }

从数据库中查找id为2的记录后,此时session缓存中有了实体,直接修改实体的值,不用update,session提交后,数据库的记录依然被修改了

wKioL1g4C0fDd1pjAAAT5rdZOLg644.png-wh_50

对于先查询再修改,

不写update,merge和

session.update(student);

session.merge(student);

都是一样的,commit后数据都会写入数据库

1
2
Student student= new  Student( 10 , "update" 100 );
         session.update(student);

直接new一个实体(其id=10的记录在数据库中不存在),直接update报错

1
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [ 0 ]; actual row count:  0 ; expected:  1

此Student对象的id设置了自增,其id=10的记录在数据库中不存在,

1
2
Student student= new  Student( 10 , "update" 100 );
         session.merge(student);

结果数据库保存了记录,但是id不为10,而是按照自增的结果,为6(插入前最大为5)

wKiom1g4EJzgXwNPAAAQnrdLgNs412.png-wh_50

1
2
Student student= new  Student( 11 , "update" 100 );
         session.saveOrUpdate(student);

而想象中可以完成此操作的saveOrUpdate()却也报错

1
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [ 0 ]; actual row count:  0 ; expected:  1
1
2
3
4
5
6
7
8
Hibernate: 
     update
         Student 
     set
         age=?,
         name=? 
     where
         id=?

发出的sql竟然是update,怎么不是save,应该是自动选择才对?