一、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. 043 Multiply Strings 字符串相乘

    给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积.注意:    num1 和 num2 的长度均小于110.    num1 和 num2 均只包含数字 0 ...

  2. linux 环境下备份oracle 数据库

    登陆linux后,进入oracle的安装目录下,找到bin那个目录,进入bin目录ls -l 看这些命令的所有者: su - oracle这时会进入这个用户的主目录/home/oracle,此时,可以 ...

  3. JDBC和分包

    JDBC(Java Data Base Connectivity,java数据库连接) JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...

  4. w3c万维网的介绍和html基本构成

    怎么与浏览器交互? 1.鼠标 2.键盘输入 w3c标准: 中文名:万维网联盟!外文名:world wide web cansortium万维网联盟创建于1994年,是web技术领域最具权威个影响的国际 ...

  5. SpringMVC+Thymeleaf 简单使用

    一.简介 1.Thymeleaf 在有网络和无网络的环境下皆可运行,而且完全不需启动WEB应用,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果.浏览器解释 h ...

  6. 一键部署Moodle开源课程管理系统

    产品详情 产品介绍Moodle https://moodle.org/ 是一个开源及自由的电子学习软件平台,亦称为课程管理系统.学习管理系统或虚拟学习环境.Moodle 特色异于其他商业线上教学平台, ...

  7. SDUT 1309 不老的传说问题 (区间DP)

    题意: 有一个环形序列,n个数字表示一种颜色,要求将白板环刷成一模一样的环,限制是每次最多只能刷连续的K个位置,问最少需要刷几次? 思路: 跟2008长春那道painter string 差不多.只是 ...

  8. 无法启动 Diagnostic Policy Service(服务错误 1079)的解决方案

    问题 在services.msc中手动启动 Diagnostic Policy Service 时,弹出以下提示: ---------------------------服务------------- ...

  9. 爬去酷狗top500的数据

    import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...

  10. python基础教程总结15——1.即时标记

    1. 测试文档: # test_input.txt Welcome to World Wide Spam. Inc. These are the corporate web pages of *Wor ...