美文网首页
Hibernate 基本知识点

Hibernate 基本知识点

作者: SYFHEHE | 来源:发表于2017-08-14 15:03 被阅读0次

    1. sessionFactory

    顾名思义,sessionFactory,就是用来创建session会话的工厂。想想有一个特别大的工厂,专门用来在你需要使用session的时候,让它帮你创建一个就好了。

    • 用来产生和管理session。
    • 通常情况下每个应用只需要一个sessionFactory。
    • 除非访问多个数据库的情况。

    SessionFactory重量级的,一个线程中只能有一个,并且是线程安全的。Hibernate的Session线程不安全,故不能在多个线程中共享。

    • 关注两个方法:
    名称 区别
    openSession() 1.永远创建新的session。2.在单线程环境中,它比getCurrentSession慢。3.需要显式刷新和关闭会话对象。4.不需要配置任何属性来调用此方法。
    getrCurrentSeesion() 1.commit之前还是原来的,commit之后新建一个session, 但是不用close session, Hibernate会帮你完成。2.您需要配置其他属性。 “hibernate.current_session_context_class”来调用getCurrentSession方法,否则会抛出异常。

    hibernate.current_session_context_class有几个取值:

    1. jta: 分布式事物 (Java Transction API)
    2. thread: 线程事物管理,一般但数据库的项目采用这个配置。
    <property name="hibernate.current_session_context_class">thread</property>
    
    1. managed:用的不多。
    2. a custom class implementing org.hibernate.context.spi. CurrentSessionContext

    2. 对象的三种状态

    对象的三种状态.png

    三种状态:

    1.瞬时状态(Transient)
    通过New创建对象,对象没有立即持久化,此时Java对象的状态为瞬时状态。Session对瞬时状态的java对象是一无所知的,此对象不在被别的对象引用时,java虚拟机会在一定时间段回收次对象。
    2.持久状态(Persistent)
    当对象与Session关联,被Session管理时,该对象就处于持久状态。
    3.游离状态(Detached)
    处于持久状态的对象,脱离与其关联的Session管理后,对象就处于游离状态。

    判断方法:

    • Transient:内存中有一个对象,缓存中没有,数据库中也没有。
    • Persistent:内存有,缓存有,数据库有。
    • Detached:内存有,缓存没有,数据库有。

    状态转换:

    • 瞬时状态转为持久状态
      通过Session对象的save()、saveOrUpDate()方法保存对象或者使用get()、load()方法获取对象。
    • 持久状态转为瞬时状态
      执行Session的delete()方法后,对象由持久状态转为瞬时状态。
    • 持久状态转为游离状态
      执行Session的evict()、clear()、close()方法,对象由持久状态转为游离状态。
    • 游离状态转为持久状态
      重新获取Session对象,执行Session对象的update()、saveOrUpdate()方法将对象从游离状态变为持久状态,也就是说通过这两个方法,可以将对象重新与Session关联。
    • 游离状态转为瞬时状态
      执行Session的delete()方法。

    3. Hibernate 核心API

    3.1 flush()

    • session.flush() : 让一级缓存与数据库同步
    • session.evict(arg0) : 清空一级缓存中指定的对象
    • session.clear() : 清空一级缓存中缓存的所有对象

    3.2 clear()

    • 批量操作使用使用:
    • Session.flush(); // 先与数据库同步
    • Session.clear(); // 再清空一级缓存内容

    3.3 get()

    • 立即发送Sql语句

    3.4 load()

    • 不立即发送Sql语句
    • 生成的是代理对象
      具体的差别可以参考以下链接:Hibernate的get和load

    3.5 update()

    如果想修改对象的单个属性不是全部更新的话:

    • xml设定property标签为dynamic-update, annotation没有对应属性;
    • 不同的session之间,可以用 merge()方法;
    • HQL也可以

    相关文章

      网友评论

          本文标题:Hibernate 基本知识点

          本文链接:https://www.haomeiwen.com/subject/pyyxlxtx.html