hibernate入门 对象的三种状态+session常用的方法

昨天试了试连表查询后,今天更加深入学了下hibernate的原理,记录下(有错误之处请直接提出,谢谢!)。

hibernate是基于实体类对象的查询,换句话说。是将数据库表与实体类一一对应后,对实体类进行操作,从而改变数据库表的信息。

hibernate将实体类的对象分为三种状态: 临时状态(Transient)、持久状态(Persistent)、游离状态(Detached)。

临时状态(Transient):刚刚new出来的实体类的对象,与hibernate没有关系,不在hibernate缓存中。这时就是临时状态

持久状态(Persistent):处于hibernate缓存中,与数据库表中的一行建立了对应关系的状态

游离状态(Detached):数据库表中有该对象对应的信息,但是对象不在hibernate缓存中了。

三种状态的转换:

临时状态-->持久状态:

session的save()或者saveorupdate()或者persist()都可以使对象变为持久状态。如果一开始new的对象设置了id,并且该id存在于数据库表中,那么save()方法会报错。因为save()本质sql是一个insert()。所以用saveorupdate()比较保险,数据库表中有该对象的id,该方法就会用update(),不然就用save()。

持久状态-->游离状态:

1)当session的事务提交后,所有的对象都处于游离状态了。

2)当session事务开启时,session调用close()或者clear()或者evict()方法,那么就会清楚缓存中所有的对象,此时对象也是处于游离态。

游离状态-->持久状态:

对象游离之后,数据库表中还存在关联信息(id),只是不在缓存中了。当session事务开启时,调用session的update或者saveorupdate方法,可以使对象重新成为持久状态。

其次:session的load()与get()可以直接取出对应的对象,并且是持久态。不过get()本质会执行select方法,load()不会,只是返回一个虚拟的对象。

session的flush方法:在session开启事务到提交事务中间,对象的变化都不会立刻执行,只有事务提交后,才会与数据库发生交互,而flush方法可以立刻执行之前的操作。

那么,我们利用hibernate对数据库进行增删改查时,又发生了什么呢?!

猜你喜欢

转载自blog.csdn.net/m0_37914211/article/details/80973105