改变持久化实体状态的方法
以下的情况都是操作非持久化的实体;
1,持久化实体的方法
save,立即将实体对应的记录插入数据库,并返回标识属性值;
persist,保证被调用处不在事务内的话,不会立即将记录马上插入数据库,在长会话流程中很有用(有疑问),不返回标识属性值;
2,根据主键加载实体
load:调用此方法时,将会返回一个代理对象,调用get或set或者其他需要操作数据库的方法时,才会真正操作数据库;如果数据库没有此记录,将会先返回一个代理对象,如果代理调用操作数据库的方法,将会抛出异常,先查一级缓存,再查二级缓存;
get:马上操作数据库,存在对应的记录,则返回对应的实体对象;如果没有对应的记录,则返回null;get支持lazy加载,只查一级缓存;
3,更新脱管实体
update,直接操作数据库,不会先进行select;
saveOrUpdate:
没有使用乐观锁:有id,更,若无对应的记录,抛出异常;无id,插入;session里有相同id的实体,抛出异常;
使用了乐观锁:versionNum为0或大于0,有id,更新,无id,插入;
merge,作用类似saveOrUpdate,不会持久化入参,但是会返回持久化的副本对象;如果被merge的对象就在session的管理下,那么session管理下的对应的对象的状态就会被覆盖,且会发送sql以进行更新;如果session下没有这条记录,就查数据库,如果merge的对象与查出来的对象不一样,就更新,如果一样,就不更新,如果数据库里面没有这条记录,则插入记录(主键生成策略就是实体类里面指定的那个策略),如果没有id,就直接插入数据库;
merge容易让人困惑,应该避免使用,merge,应该使用saveOrUpdate;
4,删除实体
delete,删除实体,实体脱管;
值得注意的是:
增删查都不需要flush,只有改才需要session进行flush操作,而flushmode为AUTO的情况下(这正也是默认的flushmode),如果在commit前clear,就不能成功更新,因为flush发生在commit时,flush前clear,session就不会管理任何对象,那么那些对象的修改也不会同步到数据库,所以更新会不成功;
浙公网安备 33010602011771号