以前做.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. 推荐书目 - C++学习资料

    前言 在本文的前半部分我我会谈谈 我看过的书,和我个人的一些理解 ,并且会提供 C++标准委员会相关链接 和 C++第三方轮子/库总结 .本文的后半部分翻译了来自 The Definitive C++ ...

  2. 自写Date工具类

    以前写项目的时候总是在使用到了时间的转换的时候才在工具类中添加一个方法,这样很容易导致代码冗余以及转换的方法注释不清晰导致每次使用都要重新看一遍工具类.因此整理出经常使用的一些转换,用作记录,以便以后 ...

  3. C# C++ Java接口类型转换

    最近这几天做了一个兼职 ,主要是把C语言以及C#语言封装的dll,经过C++中转为Java语言支持的,主要其中的问题就是类型转换,在此列出常用类型的转换过程. #include "stdaf ...

  4. sublime text 2中Windows下编写的脚本在Linux平台上运行遇到字符问题

    今天在windows下的sublime text 2下写了个脚本,上传到ubuntu服务器中执行后提示: -bash: /usr/bin/python: /usr/bin/python^M: bad ...

  5. ctype.h 字符分类与转换

      函数及说明 1 int isalnum(int c)该函数检查传递的字符是否是字母数字. 2 int isalpha(int c)该函数是否传递的字符是字母. 3 int iscntrl(int ...

  6. secedit

    secedit /export /cfg mytemplate.inf /log mylog.txt http://www.oracle-base.com/dba/script.php?categor ...

  7. 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件

      将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...

  8. 编程内功修炼之数据结构—BTree(三)总结

    BTree必须通过各种编程约束,使得不脱离BTree的本身特性: 1)BTree关键字插入操作:插入过程中,如果节点关键字达到上限,添加分裂约束,从而控制每个节点的关键字数维持在 t-1~2*t-1内 ...

  9. 剑指Offer:面试题25

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.九度OJ地址:http://ac.jobdu.c ...

  10. VS2010中经常使用的快捷键

    1. 格式化对齐:Ctrl+K+F 2. 智能感知:Ctrl+J: 3. 智能感知显示參数信息:Ctrl+Shift+空格: 4. 检查括号匹配(在左右括号间切换): Ctrl +] 5. 选中从光标 ...