以前做.net,最近做java项目,负责服务端的开发,直接用的jdbc,线程安全问题、缓存同步问题以及连接池什么的,都是手动写,不但麻烦而且容易出错。项目结束,赶快抽时间学了下hibernate,每天晚上写几个demo,一周下来,总算对hibernate有了一个整体的了解。

  Hibernate作为一个orm框架,参考我最近的项目(加载的缓存比较多,即常用而又不需要修改的数据),hibernate提供的二级缓存机制让我看到了光明`(*∩_∩*)′,就从二级缓存说下我对hibernate的理解。

Hibernate二级缓存,简而言之,是SessionFactory级别的缓存。什么意思?明白了SessionFactory是个什么东东,基本就明白了二级缓存的是个什么鬼。SessionFactory,创建Session的工厂,我们都知道Session是干嘛的,那如果我们来设计一个orm,那怎么设计SessionFactory呢?当然,SessionFactory要加载数据库连接配置、数据对象元数据,这两项是必不可少的,如果SessionFactoy不知道数据库连接字符串,还谈什么orm呢,所以说,SessionFactory是Hibernate的出发点,它加载了一切初始化配置,而且一旦加载不允许修改,从这里可以明白SessionFactory是线程安全的,再多的线程共享其数据也不会出问题,不能修改决定了这一点。一般一个应用程序在启动之时,会创建一个单例的SessionFactory,至于为什么,显而易见。二级缓存虽然是SessionFactory级别的,注意是属于其级别的,不属于SessionFactoy,因为Hibernate并没有实现它,而是采用其他缓存产品,比如ecache。什么数据适合放入二级缓存?这就要我们自己把握了,基本是一些常用且很久不修改的数据,一次加载就ok,避免频繁访问数据库。因为级别高,而且不修改(一般不修改,设置成read-only模式,read-write测试时用用就可以了),所以可以被众多的session共享之。

  说了二级缓存,现在说一级缓存,何为一级缓存?在Hibernate中,一级缓存是指Session缓存,Session缓存是如何工作的呢?先从三个概念说起,Hibernate对象可以分为三种状态:瞬态(transient,也叫临时对象)、持久状态(persistent,也叫持久化对象)、游离状态(detached)。一个临时对象一般是new出来的,持久化对象一般从数据库get出来的,游离对象一般是被session抛弃的(evict)。session缓存是在这一个会话中,保持从数据库中取出来的数据,并随时同步,保证与数据库的数据一样。这就需要一个标识唯一标识这个对象是谁,这个标识就是Object-identifier(OID)。一个临时对象经过save、persit、saveOrUpdate会变成持久化对象,一个持久化对象通过evict、close、clear等会变成游离状态,一个游离对象通过update、saveOrupdate等也可以再变回持久化对象。当然各种方法都有其特定的使用条件和限制,有些地方需要注意,这里不再多说。总之,Session缓存,是Hibernate在一个会话之中实现的与数据库互通的策略机制,不管是延迟加载、事务提交flush等等都是为了更好的维护这个缓存机制,可以说,这个session机制是hibernate的灵魂所在。

Hibernate的关系映射包括一对多、一对一、多对多以及继承映射,当然可以双向映射。同样,这三个映射各有其特点,如果去记其映射方法,比如many-to-one、one-to-one等配置,不免落入下乘。可以站在设计者的角度来看,假如我们来设计一对多映射,怎么玩呢?首先“1”的一方如果需要的话,要维护一个集合吧;“n”的一方一定需要维护一个“1”方的对象吧,因为外键必然要设在n方。那映射文件就出来了,1方需要一个Set,而且要告诉他是哪个table,外键(key)是谁,对应的对象(one-to-many)是谁,再设置inverse=true把控制权交给多方,避免重复更新。多的一方,怎么才能找到1方的那个关联对象呢,首先要知道关联对象的类名吧(class),其次要知道哪一列吧(column)。当然还有一些cascade、cache等细节配置等等。以上只是简单总结下hiberate映射,知道它能干这事就ok,具体使用的时候肯定是要参考文档的。

Hibernate提供了三种查询方式:HQL、QBC、本地SQL。HQL是hibernate特有的类似sql查询的半面向对象的查询语言,只所以说他是半面向对象,是因为它参考了sql查询语言的方式,而HQL语法中,是对象化的,比如"from  Employee where ename=:ename",这里的Employee不是表名,是类名,ename也不是数据库中的字段名而是对象属性名。QBC查询则是完全面向对象的,他通过一些静态类实现限定查询、统计查询、分页排序等。本地SQL查询,则是直接写标准的sql语句进行查询了。

  最后,还有Sesison管理,hibernate基本提供了三种管理session的方式:线程绑定、jta事务管理、hibernate委托管理,只学习了一个线程绑定管理。线程绑定session,绑定的意思是一对一,一个线程对应一个session,所以不用考虑数据共享的问题,线程安全,另外还可以在同一个线程事务中对dao层的多个方法进行管理,方便!

  学习重在总结思考,over.

  

Hibernate之总结的更多相关文章

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用

    问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...

  3. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  4. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  5. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...

  6. spring applicationContext.xml和hibernate.cfg.xml设置

    applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  7. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  8. hibernate的基本xml文件配置

    需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...

  9. Maven搭建SpringMVC+Hibernate项目详解 【转】

    前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. .net通用权限框架B/S(一)

    一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...

  2. Python基础:11.2_函数调用

    我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.这种参数传递的方式被称为函数参数的位置传递. 我们将接触更多的参数传递方式. 回忆一下位置传递 ...

  3. javascript二级联动

    二级联动在一般的网页中随处可见,一般是地址,比如点击浙江省,随后出现的是杭州市,嘉兴市:点击北京省出现的是朝阳,海淀,而不是出现杭州,嘉兴. 要想实现这个步骤,就要用到javascript来实现.其中 ...

  4. mysql_config_editor程序的用法

    1.mysql_config_editor程序的作用: 它只是用来在用户的家目录下生成一个.mylogin.cnf 里面保存有用于登录mysql-server端的password,host,user信 ...

  5. DataTables warning 错误警告

    今天使用 Charisma 框架的 jquery datatable 插件时出现如下错误: 搜索才发现 DataTables 目前不支持有单元格合并的表格.而且只要单元格数目不同就会有错误,不能使用搜 ...

  6. matlab绘制函数

    >> x1=linspace(,*pi,); x2=linspace(,*pi,); x3=linspace(,*pi,); y1=sin(x1); y2=+sin(x2); y3=+si ...

  7. JavaScript实现定点圆周运动

    目是这样的:假设有一定点(400px,300px),通过JavaScript使一个直径20px的圆点以 r=180px 为半径围绕该点做匀速圆周运动. 这个问题的整体实现思想应该是这样的,看到“半径” ...

  8. oracle的常见问题与解决

    刚接触oracle,在学习过程中遇到了很多的问题,本文章将会收藏我遇到的问题及如何解决. 错误一:ORA-28009:connection as sys should be as sysdba解决方法 ...

  9. SVG关注复杂图形的网页绘制技术

    SVG 是使用 XML 来描述二维图形和绘图程序的语言. 学习之前应具备的基础知识: 继续学习之前,你应该对以下内容有基本的了解: HTML XML 基础 如果希望首先学习这些内容,请在本站的首页选择 ...

  10. 克拉夫斯曼高端定制 刘霞---【YBC中国国际青年创业计划】

    克拉夫斯曼高端定制 刘霞---[YBC中国国际青年创业计划] 克拉夫斯曼高端定制 刘霞