天天看點

【Hibernate那點事兒】—— Hibernate應該了解的知識

前言:

  最近由于有點時間,就像深入的學習一下Hibernate.之前隻是簡單的使用,并沒領會它的妙處。這裡就趁着分享的機會,好好整理一下。

  這篇主要講到了下面幾個部分:

  Hibernate架構

  Hibernate發展背景

  Hibernate使用介紹

  Hibernate Tools安裝

  Hibernate那些必要的包

  首先說一下,這個Hibernate是做什麼的。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,既有前台頁面的内容,也有後來邏輯,甚至資料的查詢。對于開發者來說,痛不勘言,這樣分層的架構就出現了。

【Hibernate那點事兒】—— Hibernate應該了解的知識

  通常的web應用都會采用後者的模型來設計,展現層用于頁面的展現以及使用者的互動,比如struts,webwork,spring mvc等等。業務邏輯層用于對業務邏輯進行處理,這裡負責複雜的邏輯設計。資料層用于與資料庫進行互動。

  經過這樣一個演變,階層化區厘清晰了,但是程式設計卻比較痛苦。

  業務邏輯或者前台的資料,都是存儲在記憶體中,如果想要存儲在資料庫中,需要進行複雜的處理。比如JDBC來說,需要加載驅動,申請連接配接,建立執行計劃,最後還要不斷的釋放。操作資料經常變動,就要經常性的進行上述的處理。而且,記憶體中的資料,有可能因為斷電或者關機沒來得及存儲,導緻丢失。

【Hibernate那點事兒】—— Hibernate應該了解的知識

  在此種情況下,持久化應運而生。一方面負責把記憶體中的對象,随時的與本地檔案或者資料庫存儲關聯,另一方面幫助管理JDBC連接配接,避免每次複雜的操作。

  Hibernate入門使用

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

【Hibernate那點事兒】—— Hibernate應該了解的知識

  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

【Hibernate那點事兒】—— Hibernate應該了解的知識

  點選Add,輸入下面網址:http://download.jboss.org/jbosstools/updates/stable/

【Hibernate那點事兒】—— Hibernate應該了解的知識

  點選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标準日志接口

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

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的功能完善。

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

  事務處理

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

出處:http://www.cnblogs.com/xing901022

本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!