前言:

  最近由于有点时间,就像深入的学习一下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. 文件对象FSO应用 文件对象FSO应用

    FileSystemObject对象被用来访问服务器上的文件系统.这个对象能够处理文件.文件夹和目录路径.用它来检索文件系统信息也是可能的. 下面的代码创建了一个文本文件,并写入了一些文本: dim ...

  2. 【记录】BurpSuite之Grep-Extract

    借助一次sql注入来说明Grep-Extract的作用 要报出当前数据库中所有表名,这里可以有多种方法,我借助limit语句,以此来说明Grep-Extract的用法.

  3. ffmpeg+cuda+opencv

    为了让ffmpeg使用gpu进行解码,可以按以下步骤: 1 下载nvidia官网提供的ffmpeg,编译安装 https://developer.nvidia.com/ffmpeg 注意原来的选项上还 ...

  4. (转)图解SSH原理

    图解SSH原理 原文:https://www.jianshu.com/p/33461b619d53 http://blog.51cto.com/forlinux/1352900---------SSH ...

  5. git命令(转载学习)

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...

  6. TOJ 3744 Transportation Costs

    描述 Minya Konka decided to go to Fuzhou to participate in the ACM regional contest at their own expen ...

  7. Android多语言与国际化

    internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n.一般用 语言_地区的形式表示一种语言,如 zh_ ...

  8. Myeclipse编辑JSP文件时,可以点击重口顶部的箭头来切换全屏状态

  9. matlab实现M/M/1排队系统

    Matlab实现. 分为主函数 MyLine 和被调用函数 Func. 主函数 MyLine 实现在 Func 函数的基础上实现序贯法, 将平均等待队长作为每次模拟的 X,求出置信区间.Func 函数 ...

  10. 九度oj题目1521:二叉树的镜像

    题目1521:二叉树的镜像 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2061 解决:560 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF ...