一、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. 补充:jQuery的ajax

    一.jQuery的ajax 什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJA ...

  2. mysql8.0数据库忘记密码时进行修改方法

    最近安装mysql8.0数据库,用以前的修改mysql方法,没有成功,所以参考网上前辈的做法,自己重新整理了下忘记密码时进行修改方法 1.安装mysql8.0后发现,在安装目中,是没有my.ini 和 ...

  3. 《深入理解java虚拟机》笔记(8)类的加载机制

    一.类加载机制 类加载器将类的.class文件中的二进制数据读入到内存中,将其放在方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位 ...

  4. iOS优化

    load妙用 aop面向切面编程 NSNumber Or Int @()适配64位 经过漫长时间的学习 你终于掌握了iOS大法 你找到了份iOS开发的工作 信誓旦旦的要开始你的coding生涯 老板对 ...

  5. postgres创建库时指定编码格式

    postgres新建数据库时如果没有指定编码格式,会用默认的编码格式: 对于已经存在的数据库,虽然可以用:set client_encoding to 'UTF8'; set server_encod ...

  6. 首次将项目从svn下载到eclipse

    1.点击 File --> Import,进入导入项目窗口 2.选择从SVN检出项目,点击Next 3.选择创建新的资源库位置,点击Next 4.在URL处输入SVN项目远程地址,点击Next ...

  7. 用配置文件方式启动mongodb集群

  8. 通过Java代码实现图片的放大和缩小

    本文介绍的例子在Android安卓手机上测试通过. 先看看效果吧.可以看到这个开发好的安卓应用有三个按钮:Zoom In缩小图片,Zoom Out放大图片和Save保存. 初始页面: 可以在左边边框自 ...

  9. 使用Python-OpenCV向图片添加噪声(高斯噪声、椒盐噪声)

    在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声.Python-OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实现. 代码: import numpy as np impo ...

  10. VA助手添加扩展文件后缀名

    Allow C/C++ files with a non-standard extension Follow these steps to make Visual Assist consider as ...