• Hibernate知识梳理


    一、SessionFactory接口

    是单个数据库映射关系(ORM)经过编译后的内存镜像。SessionFactory(的实例)作为应用中的一个全局对象(工厂),可以随处打开/创建一个session,用来进行数据库CRUD操作。

    SessionFactory的实例是线程安全的,创建和维护SessionFactory实例的代价都很高,这也决定不会频繁地创建它。通常一个应用(数据库)只对应一个SessionFactory(单例),在应用启

    动时创建和一次性静态初始化,在应用退出时关闭。SessionFactory对象可在进程或者集群的级别上,为事务直接可重用数据提供二级缓存。

    二、Session接口

    Hibernate中的Session是应用程序与数据库交互的单线程对象。其底层封装了JDBC的Connection,也就封装了JDBC需要使用statement完成的CRUD操作,同时Session还是一个Transaction工厂,可以进行局部事务管理。

    Session对象是轻量级的,也是线程不安全的。打开和关闭Session实例并不会消耗多少资源,因为只有在需要的时候,Session 才会获取一个JDBC的Connection对象。

    Session中有一个必选的一级缓存,所有数据库操作都是暂时存储在Session一级缓存中(Hibernate会监视和检查脏数据),只有flush操作之后才会真正写入数据库, 这意味着,如果你让Session打开很长一段时间,或是仅仅载入了过多的数据, Session占用的内存会一直增长,直到抛出OutOfMemoryException异常,在用户会话期间一直保持 Session打开也意味着出现脏数据的可能性很高。

    这个问题的一个解决方法是调用clear() 和evict()来管理 Session的缓存,但是如果你需要大批量数据操作的话,最好考虑 使用存储过程。

    三、openSession() 和 getCurrentSession()的区别和联系

    区别

    FactorySession接口中定义了两种获取session的方式,即opSession()和getCurrentSession()。这两种方式的区别如下,

    1.getCurrentSession获取一个“上下文相关”的session,即在上下文相关的环境中获取的session就是同一个对象。而openSession()每次都是重新创建一个对象。

    2.getCurrentSession创建的线程会在事务回滚或事物提交后自动close(),而openSession必须手动关闭。

    上面第1点提到的“上下文相关”的判断标准是什么呢?

    Hibernate 3.1开始,是根据事务边界来界定是否为上下文相关。 在JTA事务中,当前session根据JTA来跟踪和界定。在JDBC事务中,当前session通过当前执行的线程来跟踪和界定。

    因此Hibernate中也提供了根据事务类型来设置“上下文相关”session的配置,

    * 如果使用的是全局事务(jta事务)

    <property name="hibernate.current_session_context_class">jta</property>

    * 如果使用的是本地事务(jdbc事务)

    <property name="hibernate.current_session_context_class">thread</property>

    注意,如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行任何事务或 session管理操作。

    联系

    在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

    四.映射

    映射集合属性
    集合属性中会包含多个值,多个值与实体类形成一对多的关联关系,Hibernate会将集合属性映射为单独一张表。
    常用的集合属性在映射文件中的元素有list,set,map,array等,,这些集合表需要一个外键(即实体类的主键)与实体类关联,同时对于有序集合,都需要指定一个索引列,而真正的数据则保持在数据列中。
    定义集合属性时,必须使用接口来声明集合属性,同时使用实现类来初始化集合。例如List<String> list = new ArrayList()
    其中,list和map集合是有序集合,除了指定表名,外键列,数据列之外,还需要一个索引列。
    映射组件属性
    Hibernat会在主表中增加字段来映射组件属性。通常映射的注解有两种方式,一种是在组件类上添加注解,另一种是在持久化类中添加注解。
    集合元素为组件
    Hibernate首先会创建独立的表用来存储集合,然后将组件作为集合表中的各个列。

  • 相关阅读:
    C++ XML解析之TinyXML篇[转]
    TinyXML:一个优秀的C++ XML解析器[转]
    nginx 出现413 Request Entity Too Large问题的解决方法
    redis配置认证密码
    《Discuz安装时候出现乱码 -- 问题解决方法》
    MySQL创建用户与授权
    CentOS 7 安装mysql
    setfacl命令 来自: http://man.linuxde.net/setfacl
    install pip3 for python 3.x
    自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
  • 原文地址:https://www.cnblogs.com/huangwentian/p/6421756.html
Copyright © 2020-2023  润新知