码农小汪-Hibernate学习5-hibernate中对象的三种状态分析

比较清楚这三种状态是十分有必要的,了解清楚才好做事情

  1. 瞬态:
    对象new了之后,尚未和sesssion关联在一起。瞬态的对象不会保存到数据库

  2. 持久态:
    持久化的实例的数据在数据库中有对应的记录的,并且拥有一个标识符。可以是刚刚保存的,也可以是刚刚加载的。无论哪一种,都必须有指定的session关联在一起、Hibernate 会检测到持久化对象的状态是否改变,在操作完成后将对象的数据写回数据库。开发者不需要手动的update

  3. 托管:
    某个实例曾今是持久化的状态,但是随着我们的session的关闭,该对象就变成托管的状态啦。托管状态对象的引用依然有效,可以对对象修改,重新与新的session关联的话,会写入数据库的。没有关联就不会操作的。只是对于对象的修改。

简单的区分一下就是这个
临时 —> 持久
save,persist,saveOrUpdate

托管 —> 持久
update,saveOrUpdate,saveOrUpdateCopy , merge,lock,replicate,refresh

持久 —> 托管
evict close clean

持久 —> 临时
delete

  1. save 和update区别
    save的作用是把一个新的对象保存 
    update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库(存在的记录 )
  2. saveOrUpdate update
    基本上就是合成了save和update,而update只是update

  3. persist和save
    persist把一个瞬态的实例持久化,但是并”不保证”标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。(不是立即就行动)
    save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert

  4. update 和merge
    session.update(a) a对象那个会变成持久化的状态
    而merge(a)之后,a对象不是持久化状态,而是返回a对象的一个副本,该副本处于持久化状态

  5. get and load
    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法

    当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。
    相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来

你可能感兴趣的:(Hibernate)