zoukankan      html  css  js  c++  java
  • hibernate 中对象的3种状态总结

    1.Hibernate把对象分文三种状态:Transient(临时状态)、Persistent(持久化状态)、Detached(游离状态)。

    1)Transient:刚刚new出来的对象,就是Transient状态的,此时他没有OID

    *获得瞬时态对象

    ** User user=new User();

    *瞬时态转为持久态—获得了相应的OID。

      **session.save(user)

    2)Persistent:有持久化标志OID,已经被纳入到session对象的管理

    *获得持久化对象:

      **get()/load()

    *持久态转为瞬时态对象

      **delete()   --比较有争议,进入特殊的状态,不太建议使用。

    *持久态对象转为游离态对象

      **session的close()/evict()/clear()

    3) Detached:   --有持久化标志OID,但是没有被纳入到Session对象的管理

     

    2注意:持久化对象有自动更新数据库的能力,当持久化对象的属性被改变时,调用Transaction的commit方法后,会对数据库执行update SQL操作。注意,不能改变主键的值,否则会报错

    3.三种状态的区别:

    *是否在Session对象管理下,如果在,则一定是持久态,否则是临时太或者游离态。

    *是否持有OID,没有OID的是临时状态,有OID的是持久化状态或者游离状态。

     

    临时状态

    (Transient)

    持久化状态

    (Persistent)

    游离状态

    (Detached)

    是否处于Session缓存中

    ×

    ×

    数据库中是否有对应记录

    ×

     是否有OID

    × 

     √

     √

    4.Hibernate缓存

    在Hibernate中,缓存是很重要的,它把数据缓存在内存中,提高了数据的访问效率,存在两级缓存

    1)一级缓存  ——自带的,不可卸载,以及缓存的生命周期和Session一致,一级缓存一般也称为Session级别缓存。Session接口中,存在一系列的java集合,这些集合存着一级缓存的数据,当Session对象回收时,这些集合也就回收了。当在一个Session中查询同一个对象时,是不会再次与数据库交互的。

    2)二级缓存  ——默认没有开启,需要手动配置才可以可以使用。二级缓存可以在多个Session中共享数据,二级缓存称为是SessionFactory级别的缓存。

    5.Hibernate采用快照模式。当数据对象被查询出来之后,不仅在一级缓存中存有一份数据,在快照中也存了一份。当对象被改变时,只改变缓存区中的数据内容,不该表快照区的数据。提交事务(执行Transaction.commit()),首先对比缓存区和快照区的内容,如果一致,则不做任何操作;如果不一致,则把缓存区中的数据更新到数据库,并把缓存区的数据也更新到快照区,形成新的快照。在对比的同时,完成对OID的验证一致性验证。

    注意:只有数据变成了持久态之后,数据才有快照区副本。

    6.数据库的隔离级别分为4级,分别为:Serializable(8), Repeatable(4), Read committed(2)和Read uncommitted(1)。用一解决脏读、不可重复读、虚读等隔离性问题。详情可见:https://www.cnblogs.com/fjdingsd/p/5273008.html

    *Hibernate通过hibernate.connection.isolation来配置隔离性。

    7绑定本地Session

    1)在javaWeb中使用JDBC时,一般都是在业务层开启事务,那如何把同一个Connection传递下去,有两种方法:

    *一种是通过参数传递的方式

    *另一种是吧Connection绑定到ThreadLocal对象中。

    2)现在在hibernate框架中,使用Session对象开启事物,所以需要传递session对象,框架提供了ThreadLocal的方式。

          *需要在hibernate.cfg.xml中配置<property name=”hibernate.current_session_context_class>thread></property>

          *使用SessionFactory的getCurrentSession()方法,获取当前线程的Session对象。并且该Session对象不需要手动关闭,线程结束之后会自动关闭。

    *注意:要想使用getCurrentSession()方法,必须提前配置。

    *注意:在使用绑定本地Session时,Transaction也是在service层开启的,而不是在DAO层。将事务维护交给service层。

     

     

     

     

  • 相关阅读:
    连接mysql遇到的问题
    洛谷 P3369 【模板】普通平衡树(Treap/SBT)
    开博啦
    luogu【P2753】[USACO4.3]字母游戏Letter Game
    luogu【P3377】 【模板】左偏树
    POJ-2251
    HDU-1518
    Coderforces-455A
    UVA-1608
    Coderfocers-551C
  • 原文地址:https://www.cnblogs.com/JMLiu/p/10178248.html
Copyright © 2011-2022 走看看