Hibernate常见的三种状态的讲解:
Transient : 瞬时的状态,new出来的对象,即没有被持久化,也不存在Session缓存中,即没有被session管理。
Persistent:持久化的状态,数据库中有,并且也在session缓存中中。
Detached :离线状态,指的是,已经被持久化,既数据库中有;但是不在session范围中。
一般是session.close(),session关闭了或者是session.clear(),session清空了缓存。
(1)由Transient 状态变为Persistent状态,save()或者update()方法
User u = new User(); u.setPassword("123"); //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有 //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态 session.save(u);
(2)在Persistent状态,分析具体执行了几条的sql语句
User u = new User(); u.setNickname("赵晓七");//以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有 //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态 session.save(u); //此时u是持久化状态,已经被session所管理,当在提交时,会把session中的对象和目前的对象进行比较 //如果两个对象中的值不一致就会继续发出相应的sql语句 u.setNickname("赵晓其"); //此时会发出2条sql,一条用户做插入,一条用来做更新
(3)在Persistent状态下,执行session.update()的方法,session.save(u),是没有意义的语句,
原因在于在Persistent状态下,如果u这个对象和session中的对象不一致,会发出sql语句完成更新。
不需要手动的调用session.update()或者session.save().
User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxq"); u.setNickname("赵晓八"); u.setPassword("123"); session.save(u); u.setPassword("222"); //该条语句没有意义 session.save(u); u.setNickname("赵晓吧"); //没有意义 session.update(u); u.setBorn(sdf.parse("1988-12-22")); //没有意义 session.update(u);
(4)session.load(User.class,id),也会把一个Transient 状态,变为Persistent状态。
//此时u是Persistent User u = (User)session.load(User.class, 10); //由于u这个对象和session中的对象不一致,所以会发出sql完成更新 u.setUsername("aaa");
(5)session.clear(),清空session管理范围的对象
//此时u是Persistent User u = (User)session.load(User.class, 11); u.setUsername("123"); //清空session session.clear();
(6)