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

                    小編:管理員 549閱讀 2022.09.14

                    前言: 最近由于有點時間,就像深入的學習一下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.(HQLQueryPlan.java:74)
                     at org.hibernate.engine.query.HQLQueryPlan.(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.(KeyFactory.java:66)
                     at net.sf.cglib.proxy.Enhancer.(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.(AbstractEntityTuplizer.java:135)
                     at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:55)
                     at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.(EntityEntityModeToTuplizerMapping.java:56)
                     at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:295)
                     at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:434)
                     at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:109)
                     at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
                     at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:226)
                     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
                     at com.test.orm.Service.(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.(AbstractEntityTuplizer.java:135)
                     at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:55)
                     at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.(EntityEntityModeToTuplizerMapping.java:56)
                     at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:295)
                     at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:434)
                     at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:109)
                     at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
                     at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:226)
                     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
                     at com.test.orm.Service.(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.(Configuration.java:120)
                     at com.test.orm.Service.(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.(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.(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.(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.(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
                    復制
                    關聯標簽:
                    无码精品人妻一区二区三区软件