一:flush()
1.flush使数据表的记录和Session缓存中对象保持一致,为了保持一致,则可能会发送对应的Session缓存。
2.调用Transaction的Commit方法中:先调用Session的flush方法,再提交事物。
3.flush()方法可能会发送SQL语句,但不会发送事物。
4.注意:在未提交事物或显示的调用Session.flash()方式之前,也有可能会执行flush操作。
5.执行HQL或QBC查询,会先进行flush()操作以得到数据表最新的记录。
6.若记录的ID是由底层数据库使用自增的方式生成的,则在调用save()方法后就会立即发送INSERT语句,因为SAVE方法后,必须保证对象的ID是存在的。
二:refresh()
会强置发送SELECT语句从数据库获取最新的状态,以便Session缓存中对象的状态跟数据表中对应的记录保持一致。
三:evict()
从session缓存中把指定的持久化对象移除 。
四:save()
1.save()方法使一个临时变量转变为持久化对象。
2.为对象分配ID。
3.在flash缓冲时会发送一条INSERT语句。
4.在save方法之前设置ID是无效的。
5.持久化对象的ID是不能被修改的。
五:prisist()
也会执行INSERT操作,和save的区别在调用persist方法之前,若对象已经有ID了,则不会执行INSERT,而是抛出一个异常。
六:get() VS load()
1.执行get方法会立即加载对象。而执行load方法,若不适用该对象,则不会立即执行查询操作而是返回一个代理对象,get是立即检索,load是延迟检索。
2.在代理对象之前关闭了Session的话,load方法可能会抛出LazyInitializationException 异常 。
3.若数据表中没有对应的记录,且Session也没有关闭get返回null,load若不使用该对象的任何属性,则没问题,若需要初始化了,则抛出异常。
七:update()
1.若更新一个持久化对象,不需要显示的调用update方法,因为在调用Transaction的commit()方法时,会先执行session的flush。
2.更新一个游离对象,请显示的调用session的update方法,将一个游离对象转变为持久化对象。
3.无论要更新的游离对象和数据表的记录是否一致,都会发送update语句
4.如何能让update方法不在盲目的发出update语句呢?在.hbm,xml文件的class节点设置select-before-update = true(默认为false),但通常不需要设置该属性,在与触发器工作时需要。
5.若数据表中没有对应的记录,但还调用了uodate方法,会抛出异常
6.当update()方法关联一个游离对象时,如果Session的缓存中已经存在相同OID的持久化对象,会抛出异常,因为在Session缓存中不能有两个IOD相同的对象。
八:delete()
执行删除操作,只要OID和数据表中的一条记录对应,就会准备执行delete操作, 若OID在数据表中没有对应的记录,则会抛出异常,可以通过hibernate配置文件hibernate.use_identifier_rollback为true,使其删除对象后,把OID置为null。
九:
1.若OID不为null,但数据表中还没有和其对应的记录,会抛出一个异常
2.了解:OID值等于。hbm.xml内id的unsaved-value属性值的对象,也被认为是一个游离对象