transient(瞬时状态):刚new出的一个对象,还未保存到数据库
persistent(持久化状态):对象受session托管
datached(离线状态):数据库中有,但session中没有
save: 将瞬时状态的对象,变成一个持久化状态。
save和persist区别:
使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);但使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对象的标识属性,所以程序执行 save() 会立即将持久化对象对应的数据插入数据库;而 persist() 则保证当它在一个事物外部被调用时,并不立即转换成 insert 语句, 这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。
session.beginTransaction(); User user = new User(); user.setPassword("aaa"); //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有 //执行save之后,被session所管理,此时就是Persistent状态 session.save(user); //此时u是持久化状态,已经被session所管理,当在提交时,会把session中的对象和目前的对象进行比较 //如果两个对象中的值不一致就会继续发出相应的sql语句 user.setPassword("bbb"); //此时会发出2条sql,一条用户做插入,一条用来做更新 session.getTransaction().commit();
update: 将离线状态的对象,变成一个持久化状态(当这个对象已经处于持久化状态,无论后面的多次update或者save,如果没有改变对象,在提交事务的时候都不会发出sql)
load,get:将离线状态对象,变成一个持久化状态,无论你是否执行update,在提交事务的时候,都会对比session中持久化的对象进行对比,如果不一样,则发出更新sql
clear:将持久化状态,变成离线状态,对象不受session托管
merge:当一个对象处于持久化状态,它的id是3。另个对象的id也是3,如果将第二个对象进行保存或更新操作,这是不被运行的,这样session中会存在两个引用。在这种场景会使用merge进行合并
refresh:数据库同步到对象