• 分享知识-快乐自己:Hibernate对象的三种状态


    图解:

    1):瞬时状态(Transient)

      对象与session没有关联,数据库中没有对应的数据。

      一般new出来的对象便是瞬时对象。

      对瞬时对象使用save()方法便使之成为持久对象。

      由于数据库中没有对应的数据,所以对瞬时对象使用update()方法无效。

    2):持久状态(Persistent)

      对象与session有关联,且数据库中有对应id的数据。

      使用get()、load()等方法获得的是持久对象。

      对瞬时对象使用save()方法便使之成为持久对象。

      对游离对象使用update()方法便使之成为持久对象。

      对持久对象使用delete()方法使使之成为瞬时对象。

    3):游离状态(Detached)

      对象与sessions没有关联,但数据库中有对应id的数据。

      对瞬时对象使用setId()方法,且数据库中有对应id的数据时,该对象便成为游离对象。

      当对象为持久状态时,对session执行close()、clear()、evict()等方法后,该持久对象变为游离对象。

      对游离对象使用delete()方法便使之成为瞬时对象。

      对游离对象使用update()方法便使之成为持久对象。

      由于数据库中已经存在对应id的数据,所以对游离对象使用save()方法无效。

    hibernate涉及的脏检查:

      当事务提交时(commit),hibernate会检查session中处在持久状态的对象, 判断与数据库是否一致,不一致则会将缓存里面的数据更新掉数据库里面的数据!

    那么session什么时候刷新缓存:

      1、执行commit方法时 //执行脏检查

      2、session.flush(); //不会提交事务执行脏检查

    更新数据的方法:

    update(对象):

    saveOrUpdate(对象):

     1、通过id查询主键,存在就更新,不存在就新增!

     2、当mapping配置文件的generator节点的class属性不为assigned时,造成只有update没select时,更改class为assigned可以解决!

     3、不会发起查询,直接更新 merge(对象):合并,先查询,与缓存里面的数据比较一样时不做任何操作,不一样时,再更新或者插入!效率更高!

    saveOrUpdate(对象)与merge(对象)方法:

    1、主键生成策略:

      assigned 操作一样!

    2、SQL语句不同:

      sequence,动态更新(dynamic-update="true")策略

      saveOrUpdate(对象)只更新

      merge(对象)先发起一条查询语句,在发起更新或者插入语句

  • 相关阅读:
    阿里云安全
    阿里云存储
    阿里云网络和CDN
    一文搞懂用户登录验证流程(附图)
    mybatis注解之@Mapper和@MapperScan的使用
    百度一面:谈谈 @Transactional 的原理和坑
    IDEA断点调试技巧,多张动图包教包会
    一文弄懂责任链设计模式
    美团一面:@Transactional 原理和常见的坑?
    RocketMQ消息丢失场景及解决办法
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9821406.html
Copyright © 2020-2023  润新知