前言:

  最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处。这里就趁着分享的机会,好好整理一下。

  这篇主要讲到了下面几个部分:

  Hibernate框架

  Hibernate发展背景

  Hibernate使用介绍

  Hibernate Tools安装

  Hibernate那些必要的包

  首先说一下,这个Hibernate是做什么的。Hibernate官网上面罗列了它的基本框架

  我们最常用的应该就是Hibernate ORM了。下面简单的说下几个框架的作用:

  Hibernate ORM 主要用于持久化对象。

  Hibernate Search 用于对对象进行搜索,底层基于Apache Lucene做的。

  Hibernatte Validator 用于进行校验

  Hibernate OGM 用于Nosql的持久化

  Hibernate Tools 是一款基于Eclipse的插件,用于快捷生成xxx.hbm.xml 以及 hibernate配置文件等。

  

  背景

  下面简单的介绍下ORM,最古老的编程模式没有出现时,程序猿会把所有的内容写在一起,比如一个jsp,既有前台页面的内容,也有后来逻辑,甚至数据的查询。对于开发者来说,痛不勘言,这样分层的架构就出现了。

  通常的web应用都会采用后者的模型来设计,展现层用于页面的展现以及用户的交互,比如struts,webwork,spring mvc等等。业务逻辑层用于对业务逻辑进行处理,这里负责复杂的逻辑设计。数据层用于与数据库进行交互。

  经过这样一个演变,层次化区分清晰了,但是编程却比较痛苦。

  业务逻辑或者前台的数据,都是存储在内存中,如果想要存储在数据库中,需要进行复杂的处理。比如JDBC来说,需要加载驱动,申请连接,创建执行计划,最后还要不断的释放。操作数据经常变动,就要经常性的进行上述的处理。而且,内存中的数据,有可能因为断电或者关机没来得及存储,导致丢失。

  在此种情况下,持久化应运而生。一方面负责把内存中的对象,随时的与本地文件或者数据库存储关联,另一方面帮助管理JDBC连接,避免每次复杂的操作。

  

  Hibernate入门使用

  Hibernate跟JDBC相同,也需要一些操作步骤:

  1 创建Configuration对象,配置hibernate

  2 创建SessionFactory,初始化Hibernate。这个SessionFactory是重量级的,也就是说一个应用可以用这一个SessionFactory,因为SessionFatory通常作为缓存存储了实体对象的关系映射,因此尽量不要频繁的申请释放SessionFactory。而且,SessionFactory是线程安全的,可以多线程共用一个SessionFactory。

  3 Session,保存更新删除加载查询对象。这个Session,就是一个相对轻量级的了,而且不是线程安全的,所以在每次操作结束应该释放。

  4 Transaction,用于管理事务

  5 Query,Criteria,用于进行Hql等的查询。  

  Eclipse在线安装使用Hibernate Tools

  在Eclipse的Help-->Install new Software

  点击Add,输入下面网址:http://download.jboss.org/jbosstools/updates/stable/

  点击OK  

  查找Jboss tools里面,点击Hibernate Tools下载即可。

  Hibernate比用的包以及作用

  最小量的hibernate,需要以下几个jar包

  hibernate.jar _ hibernate核心包

  antlr.jar _ hql语法解析

  asm.jar _ 字节码相关

  cglib.jar _ 生成实体对象相关

  commons-logging.jar _ 日志相关

  dom4j.jar _ 解析xml

  commons-collections.jar _ 集合框架

  jta.jar _ 事务相关

  antlr.jar

  JPA标准中,面向对象的语法检查、识别。语法分析生成器,转换hql语法。如果没有此包 hql会出错。比如from com.person  --> select * from PERSON;
  如果没有这个jar包,会报错:
Exception in thread "main" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
java.lang.NoClassDefFoundError: antlr/ANTLRException
at org.hibernate.hql.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:)
at com.test.orm.Service.findAll(Service.java:)
at com.test.orm.Service.main(Service.java:)
Caused by: java.lang.ClassNotFoundException: antlr.ANTLRException
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more

  asm.jar

  与字节码操作有关

  如果没有这个jar包会报错

java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:)
at com.test.orm.Service.<clinit>(Service.java:)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
Exception in thread "main"

  cglib.jar

  实现持久化对象的字节码生成,用于生成code的类库

  如果没有这个jar包,会报错

java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
at org.hibernate.bytecode.cglib.BytecodeProviderImpl.getProxyFactoryFactory(BytecodeProviderImpl.java:)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactoryInternal(PojoEntityTuplizer.java:)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:)
at com.test.orm.Service.<clinit>(Service.java:)
Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.CallbackFilter
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
Exception in thread "main"

  commons-logging.jar

  Apache标准日志接口

  如果没有这个jar包,会报错

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:)
at com.test.orm.Service.<clinit>(Service.java:)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
Exception in thread "main"

  dom4j.jar

  解析读取xml

  如果没有这个jar包,会报错

java.lang.NoClassDefFoundError: org/dom4j/DocumentException
at com.test.orm.Service.<clinit>(Service.java:)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
Exception in thread "main"

  commons-collections.jar

  集合与数据结构的增强包。Apache的集合框架,比jdk的功能完善。

  如果没有这个jar包,会报错

java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap
at org.hibernate.mapping.Table.<init>(Table.java:)
at org.hibernate.cfg.Mappings.addTable(Mappings.java:)
at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:)
at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:)
at org.hibernate.cfg.Configuration.add(Configuration.java:)
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:)
at org.hibernate.cfg.Configuration.addClass(Configuration.java:)
at com.test.orm.Service.<clinit>(Service.java:)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.SequencedHashMap
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
Exception in thread "main"

  jta.jar

  事务处理

  如果没有这个jar包,会报错

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/Synchronization
at org.hibernate.impl.SessionImpl.<init>(SessionImpl.java:)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:)
at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:)
at com.test.orm.Service.findAll(Service.java:)
at com.test.orm.Service.main(Service.java:)
Caused by: java.lang.ClassNotFoundException: javax.transaction.Synchronization
at java.net.URLClassLoader$.run(URLClassLoader.java:)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more

  

【Hibernate那点事儿】—— Hibernate应该了解的知识的更多相关文章

  1. Hibernate 系列 03 - 使用Hibernate完成持久化操作

    引导目录: Hibernate 系列教程 目录 康姆昂,北鼻,来此狗.动次打次,Hibernate继续走起. 目录: 使用Hibernate实现按主键查询 使用Hibernate实现数据库的增.删.改 ...

  2. hibernate学习一(hibernate简介与准备)

    一.hibernate简介 Hibernate是一个开放源代码的对象-关系映射(Object/Relational Mapping 即 ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJ ...

  3. hibernate学习笔记之四 Hibernate的增删改查

    采用JUnit测试,继承TestCase import java.util.Date; import junit.framework.TestCase; import org.hibernate.Se ...

  4. 新手上路之Hibernate:第一个Hibernate例子

    一.Hibernate概述 (一)什么是Hibernate? Hibernate核心内容是ORM(关系对象模型).可以将对象自动的生成数据库中的信息,使得开发更加的面向对象.这样作为程序员就可以使用面 ...

  5. [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 使用hibernate时出现 org.hibernate.HibernateException: Unable to get the default Bean Validation factory

    hibernate 在使用junit测试报错: org.hibernate.HibernateException: Unable to get the default Bean Validation ...

  7. 【hibernate】<第二节>hibernate的一对多映射(基本类型)

    所需工具与前文一致! 第一部分内容:基本类型的一对多(one to many) 以部门表与员工表为例: 目录结构: hibernate.cfg.xml内容 <?xml version=" ...

  8. 【hibernate】<第一节>hibernate简单入门

    所需工具: ide:eclipse or myeclipse jdk:1.7 jar包:hibernate-distribution-3.6.0.Final 和对应mysql的驱动类(对应jar包如图 ...

  9. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. ZOJ - 2401 水DP

    最近会多做点巩固基础的题目 #include<iostream> #include<algorithm> #include<cstdio> #include< ...

  2. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  3. 移除“xmlns”命名空间

    用XmlDocument创建一个文档,或者插入一个节点,默认会生成xmlns(命名空间)特性. 假定有一个xml文档如下结构: <?xml version="1.0" enc ...

  4. 九度oj题目1153:括号匹配问题

    题目1153:括号匹配问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4866 解决:2112 题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见 ...

  5. 深入理解JavaScript系列(33):设计模式之策略模式

    介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...

  6. net 预览文件 转换文件

    预览SWF文件 swfobject.js  (google浏览器 会阻止 需设置) @{ ViewBag.Title = "PdfPreview"; Layout = " ...

  7. artDialog组件应用学习(三)

    一.可以加载url的对话框 预览: 对话框编写代码 //弹出一个对话框,加载页面 function OpenBox(url, title, width, height) { seajs.use(['j ...

  8. Java开发团队管理细则

    软件开发是团队协作,多人开发很容易造成协调问题,因此,做一些必要的开发规范,有助于帮助新员工成长,也有助于提高开发效率,防止各种问题影响开发进度. 1. 代码规范 建议每位java开发人员都读一下&l ...

  9. vue——介绍和使用

    一.vue介绍 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式的JavaScript框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. ...

  10. sass文件处理

    sass注释方式有两种: 1.标准的css注释/**/: 2.//双斜杠形式的单行注释(不会被转译): 标准的css注释 双斜杆单行注释 sass文件后缀名有两种: 1.后缀名为sass,不适用用大括 ...