VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

改变持久化实体状态的方法

以下的情况都是操作非持久化的实体;

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就不会管理任何对象,那么那些对象的修改也不会同步到数据库,所以更新会不成功;

posted on 2016-08-04 11:50  bobo2018  阅读(234)  评论(0)    收藏  举报