【Hibernate那点事儿】—— Hibernate应该了解的知识

前言:

  最近由于有点时间,就像深入的学习一下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:35)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:74)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
 at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
 at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
 at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
 at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
 at com.test.orm.Service.findAll(Service.java:37)
 at com.test.orm.Service.main(Service.java:23)
Caused by: java.lang.ClassNotFoundException: antlr.ANTLRException
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 9 more

  asm.jar

  与字节码操作有关

  如果没有这个jar包会报错

java.lang.NoClassDefFoundError: org/objectweb/asm/Type
 at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:180)
 at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
 at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
 at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)
 at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
 at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
 at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
 at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
 at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
 at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:295)
 at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
 at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
 at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
 at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
 at com.test.orm.Service.<clinit>(Service.java:16)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 16 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:33)
 at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactoryInternal(PojoEntityTuplizer.java:182)
 at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:160)
 at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
 at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
 at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
 at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:295)
 at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
 at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
 at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
 at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
 at com.test.orm.Service.<clinit>(Service.java:16)
Caused by: java.lang.ClassNotFoundException: net.sf.cglib.proxy.CallbackFilter
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 13 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:120)
 at com.test.orm.Service.<clinit>(Service.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 2 more
Exception in thread "main" 

  dom4j.jar 

  解析读取xml

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

java.lang.NoClassDefFoundError: org/dom4j/DocumentException
 at com.test.orm.Service.<clinit>(Service.java:14)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 1 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:33)
 at org.hibernate.cfg.Mappings.addTable(Mappings.java:165)
 at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:290)
 at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:273)
 at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:144)
 at org.hibernate.cfg.Configuration.add(Configuration.java:669)
 at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:504)
 at org.hibernate.cfg.Configuration.addResource(Configuration.java:536)
 at org.hibernate.cfg.Configuration.addClass(Configuration.java:586)
 at com.test.orm.Service.<clinit>(Service.java:15)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.SequencedHashMap
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 10 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:213)
 at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:473)
 at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:497)
 at org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:505)
 at com.test.orm.Service.findAll(Service.java:34)
 at com.test.orm.Service.main(Service.java:26)
Caused by: java.lang.ClassNotFoundException: javax.transaction.Synchronization
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 6 more

  

本文转自博客园xingoo的博客,原文链接:【Hibernate那点事儿】—— Hibernate应该了解的知识,如需转载请自行联系原博主。

时间: 2024-09-29 10:41:33

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

【Hibernate那点事儿】—— Hibernate知识总结

前言: 上一篇简单的讲解了下Hibernate的基础知识.这里对Hibernate比较重要的一些知识点,进行总结和归纳. 手码不易,转载请注明!--xingoo 总结的知识点: 1 关于hibernate映射的实体类标识符访问权限 2 关于对象描述标识符OID及其生成策略 3 Session缓存--清理缓存 4 Session中的状态变更 5 Session中的常用方法 首先简单的看下整理的思维导图,还没有整理完,所以仅仅是一部分而已. 关于Hibernate映射 关于Hibernate的映射要

一口一口吃掉Hibernate(三)——Hibernate给表和字段设置前后缀及分隔符

       在<一口一口吃掉Hibernate(一)--使用SchemaExport生成数据表>中介绍了如何生成数据表.但是这只是最基本的.Hibernate在生成或者操作数据库时,会受一些限制.比如一开始设计表的时候,直接写成了user(id,name,password,createTime)  这种格式的.但是客户后来要求表名称要以"t_"开头,字段名要以"stu_"开头,可以是一些数据库的关键字,单词之间以"_"隔开,方便他们

Hibernate学习之------&amp;gt;Hibernate性能优化的几点建议

1.针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30.50.100.Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch Size设置为:30.50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存. 即在hibernate配制文件中进行配制: 1 <property name="hibernateProperties"> 2

【hibernate框架】搭建hibernate环境

我这次创建的是一个叫做student的表,里面存有id.name和age字段,我将搭建一个hibernate环境,利用框架的核心API对student进行数据插入.数据库用的是Mysql. 1.首先在工程中添加hibernate的jar包: 将解压路径中hibernate3.jar和lib路径下的required.jpa子目录下所有JAR包添加到应用的类加载路径中. hibernate的帮助文档在 hibernate-distribution-3.6.0.Final\documentation\

hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size

  这点我也疑惑过,最初应用hibernate的项目,我也感觉速度很慢,知道后来才知道问题的所在.       其实hibernate的速度性能并不差,比起jdbc来说,又是性能能高2倍.       当然了这和应用的数据库有关,在Oracle上,hibernate支持hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size,而MySQL却不支持,而我原来的项目绝大多数都是使用MySQL的,所以觉得速度慢,其实在企业级应用,尤其是金融系统大型应用上

Hibernate的主配置文件hibernate.cfg.xml

1:Hibernate的主配置文件的名字必须是hibernate.cfg.xml(主要配置文件中主要配置:数据库连接信息,其他参数,映射信息):常用配置查看源码:Hibernate\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties 1.1:主配置文件主要分为三部分: 注意:通常情况下,一个session-factory节点代表一个数据库: 1.1.1:第一部分 数据库连接部分,注意"hibernate.conn

系统学习hibernate之一:利用hibernate中的SchemaExport生成数据

由于hibernate3提供了自带的工具hbm2ddl,建立根据你的对象建立数据库是一件非常简单的事情. Demo结构图如下: 1.首先建立POJO类 1package org.apple.hibernate; 2 3public class User { 4 private String id; 5 private String name; 6 private String password; 7 public String getId() { 8 return id; 9 } 10 publ

第七章 Hibernate 常用配置(hibernate.cfg.xml)

<!--声明Hibernate配置文件的开始 --> <hibernate-configuration> <!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作 --> <session-factory> <!--配置数据库的驱动程序 --> <property name="hibern

Hibernate学习之------&amp;gt;Hibernate的保存的区别

hibernate的保存 hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别: 一.预备知识: 在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient.persistent.detached 下边是常见的翻译办法: transient:瞬态或者自由态 persistent:持久化状态 detached:脱管状态或者游离态 脱管状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行持久化