一、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首先会创建独立的表用来存储集合,然后将组件作为集合表中的各个列。

Hibernate知识梳理的更多相关文章

  1. hibernate 知识梳理

    一.hibernate背景介绍: 作者: Gavin King 分hibernate ORM(for relation db),OGM(for nosql db),hearch,validator,t ...

  2. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  3. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  4. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  5. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  6. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  7. solr DIH 知识梳理

    solr DIH 知识梳理 web.xml中listener配置 <listener> <listener-class>org.apache.solr.handler.data ...

  8. Anliven - 基础知识梳理汇总 - 软件测试

    基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...

  9. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

随机推荐

  1. BZOJ-3555:企鹅QQ(字符串哈希)

    PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用 ...

  2. 湖南大学新生赛C,G,J题解

    C: 思路:做几组数据就基本能发现规律,奇数为-1,偶数为1 代码: #include<cstdio> #include<iostream> #include<cstri ...

  3. D. Blocks 数学题

    Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent bo ...

  4. [转]使用 HTML5 WebSocket 构建实时 Web 应用

    HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...

  5. Java中的switch语句——通过示例学习Java编程(8)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...

  6. 利用mysqldump备份magento数据库

    在Magento开发和维护过程中,经常需要将Magento的数据库导出.导入,这些工作可以通过mysqldump这个工具来实现. 下面我来简单介绍一下mysqldump在导出导入Magento dat ...

  7. BFC(块级 格式化上下文)的理解

    本文转载(https://segmentfault.com/a/1190000013647777) 一.BFC的概念 1.规范解释 块格式化上下文(Block Formatting Context,B ...

  8. Jenkins系列——使用Dashboard View分类展示作业

    1.目标 创建的作业多了,在一个视图中展示多有不便.因此需要使用 Dashboard View 将作业按照后缀进行分类展示. 如下图,可以按照后缀添加CODE,TEST和OTHER视图. 2.环境说明 ...

  9. npm在linux即mac下更新时报错

    nam在linux即mac下需要更新到新版本:

  10. LibreOJ #2037. 「SHOI2015」脑洞治疗仪

    线段树区间合并问题 恶心... 屠龙宝刀点击就送 #include <cstdio> #define N 200005 struct Segment { int l,r,mid,sum,l ...