版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
--Hibernate簡介(開源O/R框架 一、文件的基本結(jié)構(gòu)舉例 多對一關(guān)聯(lián)---many-to- 關(guān)系模型 關(guān)聯(lián)的本質(zhì) User實(shí)體類 Group實(shí)體類的文件 User實(shí)體類的文件 多對一(先group(對象持久化狀態(tài)后,再保存 多對一加載數(shù) 一對一主鍵關(guān)聯(lián)單向(one-to- 關(guān)系模型 IdCard實(shí)體類的文件 一對一主鍵關(guān)聯(lián)測 一對一主鍵關(guān)聯(lián)加載測 一對一主鍵關(guān)聯(lián)總結(jié) 一對一主鍵關(guān)聯(lián)_雙向(one-to- 關(guān)系模型 導(dǎo)出至數(shù)據(jù)庫表生成SQL語句 一對一主鍵關(guān)聯(lián)加載數(shù)據(jù)測試—雙向 加載數(shù)據(jù)時(shí),輸出SQL語句 總結(jié) 需要在idcard文件中加入<one-to-one>指向hibernate,指示hibernate如何加載(默 一對一唯一外鍵關(guān)聯(lián)單向(one-to- 關(guān)系模型 IdCard實(shí)體文件與主鍵關(guān)聯(lián)文件相同 導(dǎo)出至數(shù)據(jù)庫生成表SQL語句如下 一對一唯一外鍵關(guān)聯(lián)測試 總結(jié) 一對一唯一外鍵關(guān)聯(lián)雙向(one-to- 關(guān)系模 總結(jié) session Session在什么情況下執(zhí)行 數(shù)據(jù)庫的級別:并發(fā)性作用 解決在逐出session緩存中的對象不拋出異常的方法 一對多關(guān)聯(lián)單向(one-to- 對象模型 關(guān)系模型 Student文件 導(dǎo)出至數(shù)據(jù)庫(hbm→ddl)生成的SQL語句 一對多單向?qū)嵗? 一對多單向數(shù)據(jù)加載 一對多關(guān)聯(lián)雙向(one-to- 學(xué)生文件修改后的 一對多數(shù)據(jù)保存,從多的一端進(jìn)行保存 生成SQL語句 Inverse和cascade區(qū)別 多對多關(guān)聯(lián)單向(many-to- 實(shí)例場景 對象模型 關(guān)系模型 User實(shí)體類 Role文件 User文件 導(dǎo)出至數(shù)據(jù)庫表所生成SQL語 多對多關(guān)聯(lián)單向數(shù)據(jù) 發(fā)出SQL語句 多對多關(guān)聯(lián)單向數(shù)據(jù)加載 多對多關(guān)聯(lián)雙向(many-to- Lazy(懶加載)在hibernate何處使用 繼承關(guān)聯(lián)繼承關(guān)聯(lián)的分類 對象模型 單表繼承 Pig實(shí)體類 單表繼承數(shù)據(jù) 單表繼承數(shù)據(jù)加載(指定加載子類 單表繼承數(shù)據(jù)加載(指定加載父類 單表繼承數(shù)據(jù)加載(指定加載父類,看能否實(shí)對象 多態(tài)查詢 采用load,通過Animal查詢,將<class>上的lazy設(shè)置為 關(guān)系模型 文件(每個(gè)類成一個(gè)表 類表繼 關(guān)系模型 文件 三種繼承關(guān)聯(lián)的區(qū)別 Component關(guān)聯(lián) User實(shí)體類 User文件(組件 導(dǎo)出數(shù)據(jù)庫輸出SQL語句 組件數(shù)據(jù)保存 復(fù)合主鍵關(guān)聯(lián) 實(shí)體類:(中了復(fù)合主鍵類 導(dǎo)出數(shù)據(jù)庫輸出SQL語句 復(fù)合主鍵關(guān)聯(lián)數(shù)據(jù) 其它關(guān)聯(lián)實(shí)例 集合關(guān)聯(lián)文件實(shí)例 導(dǎo)出至數(shù)據(jù)庫輸出SQL語句 集合數(shù)據(jù) 悲觀鎖 實(shí)例 實(shí)體類 文件 樂觀鎖 實(shí)體類 文 節(jié)點(diǎn)文件 測試代碼 HQL簡單例 HQL演示環(huán) 條件查 hibernate支持原生SQL查 查詢過濾 分頁查 連接查 統(tǒng)計(jì)查 分組查 dml風(fēng)格查 028--01hibernate一級緩 028--02hibernate二級緩 028--03hibernate查詢緩 Hibernate學(xué)習(xí)筆記--Hibernate簡介(開源O/R框架ORM(ObjectRelationalMap)---是一種為了解決面向?qū)ο笈c關(guān)系型數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技成的)Hibernate做什么%%將對象數(shù)據(jù)保存到數(shù)據(jù)庫、將數(shù)據(jù)庫數(shù)據(jù)讀入到對象中阻抗不匹配---例 類中有繼承關(guān)系,但關(guān)系型數(shù)據(jù)庫中不存在這個(gè)概念這就是阻抗不匹配。Hibernate存在的原因Hibernate的優(yōu)缺點(diǎn)4、Hibernate實(shí)現(xiàn)了透明持久化:當(dāng)保存一個(gè)對象時(shí),這個(gè)對象不需要繼承Hibernate中的任何類、實(shí)現(xiàn)任何接口,只是個(gè)純粹的單純對象—稱為POJO對象(最純粹的對象—這個(gè)對象沒有繼承第框架的5、Hibernate是一個(gè)沒有侵入性的框架,沒有侵入性的框架我們一般稱為輕量級框架Hibernate使用范圍Hibernate的重點(diǎn)學(xué)習(xí):Hibernate的對象關(guān)系對象---關(guān)系模常用的O/R框架1Hibernate3、JDO(是SUN一套標(biāo)準(zhǔn)—Java數(shù)據(jù)對象)4、Toplink(Orocle公司的)6、IBatis(非常的輕量級,對JDBC做了一個(gè)非常非常輕量級的包裝,嚴(yán)格說不是O/R框架,而是基于SQL的(提供了一套配置文件,把SQL語句配置到文件中,再配置一個(gè)對象進(jìn)去,只要配--第一個(gè)HibernateHibernate壓縮文件結(jié)構(gòu) jar包build.sh:運(yùn)行在Unix系統(tǒng)上打包;doc: 文檔eg:一個(gè)etc:Hibernate中需要使用的配置文件的模板lib:HibernateJar包src:Hibernate的源代碼搭建Hibernate的使用環(huán)境:第一步window→PreferencesJavaBuildPathUserLibrariesNew按鈕后輸入庫名→點(diǎn)擊第二步:加入所需要的JAR包:點(diǎn)擊“Hibernate3”項(xiàng)→“AddJARs…”按鈕→在彈出的框選擇需要的JAR 為項(xiàng)目引入hibernateJAR右鍵項(xiàng)目→Properties→JavaBuildPath→右邊點(diǎn)擊”Libraries”選項(xiàng)卡→“AddLibrary…”按鈕→UserLibrary→”next”按和 配置mysql數(shù)據(jù)庫連接串配置mysql數(shù)據(jù)庫jdbc驅(qū)動(dòng)配置mysql數(shù)據(jù)庫連接用戶<property<!--配置mysql數(shù)據(jù)庫連接用 <property是否顯示hibernate的SQL<property<property<!--配置實(shí)體 將模板文件到ClassPath根下(src 為了不需要多于的提示信息,可以將此配置文件中一些配置項(xiàng)取消了。但要保留log4j.rootLogger=warn,5義實(shí)體例如:User實(shí)體類6、定義User類的文件(重要、關(guān)鍵)— <!- <idname="id"<!--generator設(shè)置主鍵生成策略<generator<!-- <propertyname="name"<property類型--><property<!--配置實(shí)體 <!--配置實(shí)體 packageimportimport @author@version1.0packageimportimport @author@version1.0publicclassExportDBpublicstaticvoidmain(String[] Configurationcfg=newSchemaExportexport=new}}packageimportimportimportimportpackageimportimportimportimportpublicclassClientpublicstaticvoidmain(String[] Configurationcfg=newSessionFactoryfactory=Sessionsession=null;trysession=Useruser=newUser(); }catch(Exception{}finallyif(session!=null)}}}}<property<property
器 Hibernate可以JNDI、JDBC、JNDI(Java名稱和 接池也是把對象到JNDI這棵樹上,以后只要用連接串來對象。好處:我們對象可以統(tǒng)一管理,JTA(Java事務(wù)API):使JTA才能保證跨數(shù)據(jù)庫、資源,JTA實(shí)現(xiàn)了兩階段的提交協(xié)議(第一階段:盡量記錄日志(如回滾日志,以方便發(fā)生錯(cuò)誤進(jìn)行滾操作),第二階段:才是實(shí)現(xiàn)的提交。)。JTA是一種容器。EJB默認(rèn)作用JTA事務(wù)久、、、久、、、持持1們2(回收久的3持(回收就變Persistent對象(持久性對象)session的管理Detached對象:也可能被回收器回收掉(數(shù)據(jù)庫中存在對應(yīng)的記錄,只是沒有任何對象它是指session),注Persistent狀態(tài),沒有納session的管理Publicvoidtest trysession=trysession=HibernateUtils.getSession();tx=session.beginTransaction();usernewUser(); }catch(Exceptione)}finally}session現(xiàn)在一條數(shù)據(jù):User對象name: 前對現(xiàn)有數(shù)據(jù)記錄照一個(gè)快照(這個(gè)快照為數(shù)據(jù)“name:”),現(xiàn)在要User對象的name更改為五王(name:五王),當(dāng)session提交事務(wù)之前時(shí)commit(),需要清理緩存(也稱為賍數(shù)據(jù)對比),查看哪些數(shù)據(jù)需要發(fā)innert的數(shù)據(jù)發(fā)生改變,就發(fā)出update語句)publictestSave1(){Sessionsession=null;Transactiontx=nullpublictestSave1(){Sessionsession=null;Transactiontx=null;Useruser=null;trysession=HibernateUtils.getSession();tx=session.beginTransaction();usernewUser(); Hibernate:insertintoUser(name,password,createTime,expireTime,id)values(?,?,?,Hibernate:updateUsersetname=?,password=?,createTime=?,expireTime=?where}catch(Exception}finally} trysession=HibernateUtils.getSession(); 。Hibernate:updateUsersetname=?,password=?,createTime=?,expireTime=?whereid=?}catch(HibernateExceptione)//TODOAuto-generatedcatchblock}finally}}Hibernate加載數(shù)據(jù):1Session.get(Classarg0Serializablearg1)trysession=sf.openSession();Objectorg.hibernate.Session.get(Classarg0,Serializabletrysession=sf.openSession();Objectorg.hibernate.Session.get(Classarg0,Serializablearg1)throwsUseruser=(User)session.get(User.class,System.out.println(" }catch(HibernateException{e.printStackTrace();}if(session!=null){(session.isOpen()){s}}2ObjectSession.load(Classarg0Serializablearg1throwsload方法加載數(shù)據(jù),如果數(shù)據(jù)庫中沒有相應(yīng)的記錄,則會(huì)拋出異常對象不找到trytrysession=sf.openSession();Useruser=System.out.println("user.getName()); }catch(HibernateException{e.printStackTrace();}if(session!=null){(session.isOpen()){s}}Hibernate兩種加載數(shù)據(jù)方式的區(qū)別:get()方法在查詢不到數(shù)據(jù)時(shí)null,而load因?yàn)橹С盅舆t加載,只有在使用對象時(shí)才加載,所以如果數(shù)據(jù)庫中不在數(shù)據(jù)load會(huì)拋出異常(org.hibernate.ObjectNotFoundException)。用hibernatetrysession=sf.openSession();Useruser=newUser();trysession=sf.openSession();Useruser=newUser();它}catch(HibernateExceptione)//TODOAuto-generatedcatchblock}if(session!=null){(session.isOpen()){s}}}Hibernate對象刪除后,對象狀態(tài)為Transistent狀態(tài)。*hibernate刪除*hibernate刪除對publictestDelete1(){Sessionsession=null;trysession=HibernateUtils.getSession();Useruser=(User)session.load(User.class,}catch(HibernateException{e.printStackTrace();}if(session!=null){(session.isOpen()){}}}--queryhql:是查詢對象的,例如:"fromUser",其中from不區(qū)分大小寫,而User是區(qū)分大小寫,因?yàn)樗菍ο?。Hibernate:selectuser0_.idasHibernate:selectuser0_.idasid0_,user0_.nameasname0_,user0_.passwordaspassword0_,user0_.createTimeascreateTime0_,user0_.expireTimeasexpireTime0_fromUserQueryqueryQueryquery=session.createQuery("fromListuserList=publicvoidpublicvoidtestQuery1(){Sessionsession=null;trysession=HibernateUtils.getSession();Queryquery=session.createQuery("fromListuserList=for(Iteratoriter=userList.iterator();iter.hasNext();){Useruser=(User)iter.next();System.out.print(user.getId()+"}}catch(HibernateException{e.printStackTrace();}finally}006開源O/R框架內(nèi)容回從ORM詞來看,O---Object(對象模型);R---Relational(關(guān)聯(lián)模型),可以做對象和關(guān)聯(lián)的一種,當(dāng)然這只是部分功能,一個(gè)完善ORM框架應(yīng)該具有的功能:如HQL相關(guān)的查詢語句、提供緩存機(jī)制(一級緩存、二級緩存)。Java開發(fā)數(shù)據(jù)庫時(shí),使用JDBC,但是需要編寫大量相同的代碼,這樣不便提高生產(chǎn)效率hibernate可以讓你不能編寫大量的相同的代碼。從而提高生產(chǎn)效率。另一方面,hibernate可以讓我們更面對象化開發(fā),還有一個(gè)移植性hibernate只需要更改配置文件(數(shù)據(jù)庫適配器)的選項(xiàng),就可以非常方便的移植到不同的數(shù)據(jù)庫,而不需要重新編寫不同這個(gè)功能(目前數(shù)據(jù)庫還不是面向?qū)ο?,都是關(guān)系型數(shù)據(jù)庫)),使用hibernate框架,侵入性比較好(因此hibernate稱為輕量O/R框架和使用環(huán)境:在程序中添加→修改→保存;查詢可以批量,但是修改不可為批量性;程序中有大量的數(shù)據(jù)只讀,這樣就可以到緩存中;對象間存在自然的關(guān)系;不需要數(shù)據(jù)庫SQL特定的語句優(yōu)化。newConfiguration()默認(rèn)是perties,所以使用new制都由SessionFactory來,它與二級緩存是綁定的。通常只創(chuàng)建一次,但它是線程安全的。07--- 基本和屬性介一、文件的基本結(jié)構(gòu)舉例<?<?xml<!DOCTYPEhibernate-"-//Hibernate/Hibernate DTD > <class <idname="id"<!--generator設(shè)置主鍵生成策略<generator<!-- <propertyname="name"<property<property 所有普通屬性:不包括自定義類、集合和數(shù)組等的Java基本數(shù)據(jù)類型。二、<hibernate- >。假schema可選數(shù)據(jù)庫schema的名稱catalog可選數(shù)據(jù)庫catalog的名稱default-cascadenonedefault-access(可選-默認(rèn)為property):Hibernate用來所有屬性的策略??梢酝ㄟ^實(shí)PropertyAccessor接口義default-lazy默認(rèn)true指定了未明確注明lazy屬性的JavaHibernate會(huì)auto-import默認(rèn)true指定我們是否可以在查詢語言中使用非全限定的類名(僅限于本假若你有兩個(gè)持久化類,它們的非全限定名是一樣的(就是兩個(gè)類的名字一樣,所在的包不一樣--譯者注),你注意hibernate-map元素允許你嵌套多個(gè)如上所示的<class>。但是最好的做法(也許一些工具需要的)是一個(gè)持久化類(或一個(gè)類的繼承層次)對應(yīng)一個(gè)文件,并以持久化的超類名稱命名,例如:Cat.hbm.xml,三、where="arbitrarysqlwherecondition"check="arbitrarysqlcheckname(可選持久化類(或者接口)的Java全限定名Hibernate將假定這是一個(gè)非POJO的實(shí)體。table(默認(rèn)是類的非全限定名DDL時(shí)數(shù)據(jù)表名,如果省略,則名稱同discriminator-value(默認(rèn)和類名一樣一個(gè)用于區(qū)分不同的子類的值,在多態(tài)行為時(shí)使用。它可以接受的值包括null和xy(可選):指定一個(gè)接口,在延遲裝載時(shí)作為使用。你可以在這里使用該類自己的名字dynamic-update(可選默認(rèn)falseUPDATESQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那dynamic-insert(可選默認(rèn)falseINSERTSQL將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段(在添加記錄時(shí),只添加非null的字段)。select-before-update(可選默認(rèn)falseHibernate除非確定對象真正被修改了(如果該值true-譯注),否則不會(huì)SQLUPDATE操作。在特定場合(實(shí)際上,它只在一個(gè)瞬時(shí)對象(transient額外SQLSELECT操作,來決定是否應(yīng)該執(zhí)行UPDATE。polymorphism(多態(tài))(可選默認(rèn)值為implicit隱式界定是隱式還是顯式的使用多態(tài)查詢(這只在Hibernate的具體表繼承策略中用到-譯注)。where(可選指定一個(gè)附加SQLWHERE件persister(可選指定一個(gè)定制ClassPersisterbatch-size(可選,1指定一個(gè)用(identifier)抓取實(shí)例時(shí)使用的"batchlazy(可選通過設(shè)lazy="false有的延遲加載(Lazyfetching)功能將被全部禁entity-name(可選,默認(rèn)為類名):Hibernate3允許一個(gè)類進(jìn)行多次(前提是到不同的表),并且允許使用Maps或XML代替Java層次的實(shí)體(也就是實(shí)現(xiàn)動(dòng)態(tài)領(lǐng)域模型,不用寫持久化類-譯注)。rowid(可選):Hibernate可以使用數(shù)據(jù)庫支持的所謂的ROWIDs,例如:Oracle數(shù)據(jù)庫,如果你設(shè)置這個(gè)可選的rowid,Hibernate可以使用額外的字段rowid實(shí)現(xiàn)快速更新。ROWID是這個(gè)功能實(shí)現(xiàn)的重點(diǎn),它代表了subselect(可選):它將一個(gè)不可變(immutable)并且只讀的實(shí)體到一個(gè)數(shù)據(jù)庫的子查詢中。當(dāng)你):>的繼承結(jié)構(gòu)若指明的持久化類實(shí)際上是一個(gè)接口,這也是完全可以接受的你可以用元素<subclass>來指定該接口的實(shí)際實(shí)現(xiàn)類。你可以持久化任何static(靜態(tài)的)類。你應(yīng)該使用標(biāo)準(zhǔn)的類名格式來指定類名,比如:Foo$Bar。理的某個(gè)方法被實(shí)際調(diào)用的時(shí)候,真實(shí)的持久化對象才會(huì)被裝載。參見下面的“用于延遲裝載的”。Implicit(隱式)的多態(tài)是指,如果查詢時(shí)給出的是任何超類、該類實(shí)現(xiàn)的接口或者該類的個(gè)出明確的該類名字時(shí)才會(huì)返回這個(gè)類的實(shí)例;同時(shí)只有在這個(gè)<class>的定義中作為<subclass>或者<joined-persister性可以讓你定制這個(gè)類使用的持久化策略可以指定你自己實(shí)現(xiàn)org.hibernate.persister.EntityPersister的子類,你甚至可以完全從頭開始編寫一個(gè)實(shí)現(xiàn)。參閱org.hibernate.test.CustomPersister,這是一個(gè)簡單的例子(“持久化”到一個(gè)Hashtable)。中可能需要再次設(shè)置。這些設(shè)置是否能夠提高效率要視情形而定。請用你的智慧決定是否使用??梢苑乐箶?shù)據(jù)庫不必要的觸發(fā)update。這就很有用了。all(全部)查全部字并且這也是唯一能夠處理在session行操作的策略(例如:在使用Session.merge()的時(shí)候)。<class ,max(bid.amount), from joinbidonbid.item_id= groupby<synchronize<synchronize<id對Hibernate來說視圖和表是沒有區(qū)別的,這是因?yàn)樗鼈冊跀?shù)據(jù)層都是透明的(注意:一些數(shù)據(jù)庫不支持視圖屬<class ,max(bid.amount), from joinbidonbid.item_id= groupby<synchronize<synchronize<id查詢不會(huì)返回過期數(shù)據(jù)。<subselect>在屬性元素和一個(gè)嵌套元素中都可見。四、標(biāo)識(shí)。<id>元素定義了該屬性到數(shù)據(jù)庫表主鍵字段 <generatorname可選標(biāo)識(shí)屬性的名字(實(shí)體類的屬性)hbernate類型(integer,longshort,float,double,character,byte,boolean,yes_no,column默認(rèn)為屬性名主鍵字段的名字(省略則name為字段名)unsaved-value(可選-默認(rèn)為一個(gè)切合實(shí)際(sensible)的值):一個(gè)特定的標(biāo)識(shí)屬性值,用來標(biāo)志access(可選-默認(rèn)為property):Hibernate用來屬性值的策略。如果name屬性不存在,會(huì)認(rèn)為這個(gè)類沒有標(biāo)識(shí)屬性。(一)、<generator>元素(主鍵生成策略<idname="id"type="long"<generator<param<param<idname="id"type="long"<generator<param<param所有的都實(shí)現(xiàn)org.hibernate.id.IdentifierGenerator接口。這是一個(gè)非常簡單的接口;某些應(yīng)用對DB2,MySQL,MSSQLServer,Sybase和 longshortint類型的(數(shù)據(jù)庫自增在DB2,PostgreSQLOracleSAPDBMcKoi中使用序列(sequence)Interbase,使用一個(gè)高/低位算法高效的生成long,short或者int類型的標(biāo)識(shí)符。給定一個(gè)表和字段(默認(rèn)分別是使用一個(gè)高/低位算法來高效的生longshortint類型的標(biāo)識(shí)符,給定一個(gè)數(shù)據(jù)庫序列(sequence)編碼為一個(gè)3216進(jìn)制數(shù)字的字符串,它的生成是由hibernate生成,一般不會(huì)重復(fù)。在MSSQLServerMySQL中使用數(shù)據(jù)庫GUID字符串formula="arbitrarySQLexpression":column默認(rèn)為屬性名字對應(yīng)的數(shù)據(jù)庫字段名<column>元素指定。(如果省略則使用,則使用name所指定的名稱為字段名)hbernate類型(integer,longshort,float,double,character,byteboolean,yes_no,true_false)update,insert可選trueUPDATE和/INSERTSQL語句中是否包含到同一個(gè)(或多個(gè))字段的某些其他屬性,或者通過一個(gè)trigger(觸發(fā)器)或其他程序生成。access(可選-默認(rèn)值為property):Hibernate用來屬性值的策略lazy(可選-默認(rèn)為false):指定指定實(shí)例變量第一次被時(shí),這個(gè)屬性是否延遲抓?。╢etchedlazily)(需要運(yùn)行時(shí)字節(jié)碼增強(qiáng))。optimistic-locktrue指定這個(gè)屬性在做更新時(shí)是否需要獲得樂觀鎖generatednever表明此屬性值是否實(shí)際上是由數(shù)據(jù)庫生成的。請參閱第5.6節(jié)“數(shù)據(jù)庫生成屬性(GeneratedProperties)”的討論。Hibernate基本類型名(比如:integerstringcharacter,datetimestampfloatbinary,serializable,object,blob)。Java類的名字,這個(gè)類屬于一種默認(rèn)基(比如intfloat,charjava.lang.String,java.util.Date,java.lang.Integer,java.sql.Clob)。比如:如果你沒有指定類型,Hibernarte會(huì)使用反射來得到這個(gè)名字的屬性,以此來猜測正確的Hibernate類型。access屬性用來讓你控制Hibernate如何在運(yùn)行時(shí)屬性。在默認(rèn)情況下,Hibernate會(huì)使用屬性的問成員變量。你也可以指定你自己的策略,這就需要你自己實(shí)現(xiàn)perty.PropertyAccessor接口,再在access中設(shè)置你自定義策略類的名字。<property<propertyformula="(SELECTSUMty*p.price)FROMLineItemli,ProductWHEREductId=ductIdANDli.customerId=customerIdANDli.orderNumber=orderNumber 果你不喜歡使用屬性,你可以使用嵌套的<formula>元素。<?xml<?xml<!<!DOCTYPEhibernate-"-//Hibernate/Hibernate DTD > <class<!- <idname="id" uuid:一萬年內(nèi)生成唯一的字符串--<generator <propertyname="name"unique="true"not-null="true"<propertyname="password"not-null="true"<property 利用org.hibernate.tool.hbm2ddl.SchemaExport工具類生成如下HQLcreatecreatetableUser1(idvarchar(255)notnull,namevarchar(20)notnullpasswordvarchar(10)notnull,createTimedatetime,expireTimedatetime,primarykey再利用hibernatepublicvoidSessionsession=null;Transactiontx=trytx=User1user=newUser1(); }catch(Exception{}finally}}Hibernate:insertHibernate:insertintoUser1(name,password,createTime,expireTime,id)(?,?,?,?,、實(shí)現(xiàn)了一個(gè)所有方法都為public的接口。通過設(shè)置lazy="false"來明確地禁用。接層(原文為"非直接",indirection)會(huì)好一些。默認(rèn)情況下Hibernate持久化JavaBeans風(fēng)格的屬性,認(rèn)可getFoo,isFoo和setFoo這種形式的方法名。如果需要,你可以對某些特定屬性實(shí)行直接字段。對的屬性進(jìn)行持久化008關(guān)聯(lián)多對many-to-一對one-to-一對one-to-多對many-to-多對一關(guān)聯(lián)---many-to-一關(guān)聯(lián)個(gè)持有組的。id:name:Stringgroup:id:name: | 11121關(guān)聯(lián)的本質(zhì)Userpublicpublicclass{privateintid;privateStringname;privateGrouppublicGroupgetGroup()return}publicvoidsetGroup(Groupgroup)this.group=}}publicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}}Group實(shí)體類:publicpublicclass{privateintid;privateStringname;publicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}}實(shí)體類建立完后,開始創(chuàng)建文件,先建立簡單的文件Group實(shí)體類的文件><idname="id"<generator<property User實(shí)體類的文件><idname="id"<generator<property<!--<many-to-one>關(guān) <many-to-onename="group" ※<many-to-one>例如:例如:<many-to-onename="group<many-to-one>關(guān)聯(lián)多對一的關(guān)altertablet_userdropforeignkeyFKCB63CCB695B3B5ACdroptableifexistst_groupdroptablealtertablet_userdropforeignkeyFKCB63CCB695B3B5ACdroptableifexistst_groupdroptableifexistscreatetablet_group(idintegernotnullauto_increment,namevarchar(255),primarykey(id))createtablet_user(idintegernotnullauto_increment,namevarchar(255),groupidinteger,primarykey(id))altertablet_useraddindexFKCB63CCB695B3B5AC(groupid),addconstraintFKCB63CCB695B3B5ACkey(groupid)referencest_group多對一(先group(對象持久化狀態(tài)后,再保存sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Groupgroup=newGroup();session.save(group);// Useruser1newUser();Useruser2=newUser(); Hibernate:insertintoHibernate:insertintot_group(name)valuesHibernate:insertintot_user(name,groupid)values(?,?)Hibernate:insertintot_user(name,groupid)values(?,結(jié)果:persistent狀態(tài)的對象是不能Transient狀態(tài)的對group對象。而是直接保存user對象,這樣就可以在user之前先把group了。1、all:代碼在所有的情況下都執(zhí)行級2、none:在所有情況下都不執(zhí)行級聯(lián)操"""session=HibernateUtils.getSession();tx=session.beginTransaction();session=HibernateUtils.getSession();tx=session.beginTransaction();Useruser=(User)session.load(User.class,3);System.out.println("="+user.getName());System.out.println("="+user.getGroup().getName());Hibernate:selectuser0_.idasHibernate:selectuser0_.idasid0_0_,user0_.nameasname0_0_,user0_.groupidasgroupid0_0_fromt_useruser0_whereuser0_.id=?Hibernate:selectgroup0_.idasid1_0_,group0_.nameasname1_0_fromt_groupgroup0_可以加載Group信息:因?yàn)椴捎昧?lt;many-to-one>這個(gè),這個(gè)會(huì)在多的一端(User)加一個(gè)外鍵,指向一的group屬性。一對一主鍵關(guān)聯(lián)_單向(one-to- 實(shí)例場景:人—->號( →IdCard),從IdCard看不到 id:name:StringidCard:IdCardid:cardNo:publicpublic{privateintprivateStringpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetCardNo()return}publicvoidsetCardNo(StringcardNo)this.cardNo=}}實(shí)體類:publicpublic privateintprivateprivateStringpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}publicIdCardgetIdCard()return}publicvoidsetIdCard(IdCardidCard)this.idCard=}}2||| idcard的值 IdCard實(shí)體類的文件><idname="id"<generator<property Persion實(shí)體類的文件><class<idname="id"" <generator<param<property<!--<one-to- <one-to-onename="idCard" createcreatetablet_idcard(idintegernotnullauto_increment,cardNovarchar(255),primarykey(id))createtablet_ (idintegernotnull,namevarchar(255),primarykey(id))altertablet_ addindexFK785BED805248EF3(id),addconstraintFK785BED805248EF3foreignkey(id)referencest_idcard(id)*altertable……意思 ※<one-to-one><idname="id"<generator<param<one-to-onename="idCard"現(xiàn)在是使用一對一主鍵關(guān)聯(lián),因?yàn)橹麈I不是自己生成的,而是作為一個(gè)外鍵(來源于其它值),所以使用<idname="id"<generator<param<one-to-onename="idCard"一對一主鍵關(guān) sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();IdCardIdCardidCard=new= 注:不會(huì)出現(xiàn)TransientObjectException異常,因?yàn)橐粚σ恢麈I關(guān) 中,默認(rèn)了cascade屬性Hibernate:insertHibernate:insertintot_idcard(cardNo)valuesHibernate:insertinto (name,id)values(?,一對一主鍵關(guān)聯(lián)加載測sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();=( .class,1); .name="+ System.out.println("idCard.cardNo="+ 生成SQLHibernate:Hibernate:0_0_.idas0_.nameasname0_0_fromHibernate:selectidcard0_.idasid1_0_,idcard0_.cardNoascardNo1_0_fromt_idcardidcard0_whereidcard0_.id=? 一對一主鍵關(guān)聯(lián)總結(jié)<idname="id"<idname="id"<generator<param<property <one-to-onename="idCard"一對 實(shí)例場景:人<—->號( <->IdCard)雙向:互相持有對方的id:name:StringidCard:IdCardid:cardNo::publicpublic{privateintprivateStringpublicintgetId()return}//持publicvoidsetId(intid)this.id=}publicStringgetCardNo()return}publicvoidsetCardNo(StringcardNo)this.cardNo=}};()publicvoid}()=;}實(shí)體類:publicpublic{privateintprivateStringpublicintgetId()returnreturn}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}publicIdCardgetIdCard()return}publicvoidsetIdCard(IdCardidCard)this.idCard=}}4||| IdCard實(shí)體類文件><idname="id"<generator<property <one-to-one 實(shí)體類 文件不變導(dǎo)出至數(shù)據(jù)庫表生成SQLcreatecreatetablet_idcard(idintegernotnullauto_increment,cardNovarchar(255),primarykey(id))createtablet_ (idintegernotnull,namevarchar(255),primarykey(id))altertablet_ addindexFK785BED805248EF3(id),addconstraintFK785BED805248EF3foreignkey(id)referencest_idcard(id)注意:此雙向的SQL語句,與單向的SQL語句沒有任何變化,也就是說數(shù)據(jù)庫中的表單向雙向沒有任何區(qū)別。<one-to-one>Hibernate如何加載數(shù)據(jù)對象。一對一主鍵關(guān)聯(lián)加載數(shù)據(jù)測試—雙向sessionsession=tx=IdCardidCard=(IdCard)session.load(IdCard.class,.name="+加載數(shù)據(jù)時(shí),輸出SQLHibernate:selectidcard0_.idasid1_1_,idcard0_.cardNoascardNo1_1_,1_.idid0_0_,1_.nameasname0_0_fromt_idcardidcard0_leftouterjoin1_on1_.idwhere需要在idcard文件中加入<one-to-one>指向hibernate,指示hibernate如何加載 一對 唯一外鍵關(guān)聯(lián)_單向(one-to- 實(shí)例場景:人—->號( →IdCard),從IdCard看不到 id:name:StringidCard:IdCardid:cardNo: 56|10||| id|cardNo 100|88888888888888888200|IdCard實(shí)體文件與主鍵關(guān)聯(lián)文件相同><idname="id"<generator<property 實(shí)體類 文件><class<idname="id"<generator"<<propertymany-to-one>:在多的一端(IdCard),但多對一關(guān)聯(lián) <many-to-onename="idCard" 導(dǎo)出至數(shù)據(jù)庫生成表SQLcreatecreatetablet_idcard(idintegernotnullauto_increment,cardNovarchar(255),primarykey(id))createtablet_ (idintegernotnullauto_increment,namevarchar(255),idCardintegerunique,primarykey(id))altertable addindexFK785BED80BE010483(idCard),addFK785BED80BE010483foreignkey(idCard)referencest_idcard一對一唯一外鍵關(guān) sessionsession=tx=IdCardidCard=newIdCard();= Hibernate:insertintoHibernate:insertintot_idcard(cardNo)valuesHibernate:insertinto (name,idCard)values(?,一對一唯一外鍵關(guān)聯(lián)得多對一關(guān)聯(lián)的特例一對一唯一外鍵關(guān)聯(lián)。一對 唯一外鍵關(guān)聯(lián)_雙向(one-to- 實(shí)例場景:人<—->號( <->IdCard)雙向:互相持有對方的id:name:Stringid:cardNo:: 7|10|1008||200publicpublic{privateintprivateString //持publicpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetCardNo()return}publicvoidsetCardNo(StringcardNo)this.cardNo=}};()publicvoid}()=;}實(shí)體類:publicpublic{privateintprivateStringpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}publicIdCardgetIdCard()return}publicvoidsetIdCard(IdCardidCard)this.idCard=}}實(shí)體類 文件 <<class<idname="id"<generator<propertymany-to-one>:在多的一端("IdCard),但多對一關(guān)聯(lián) <many-to-onename="idCard" IdCard實(shí)體類文件><idname="id"<generator<property <one-to-one <one-to-one <one-to-one Session在什么情況下執(zhí)行注:如果主鍵生成策略是uuid等不是由數(shù)據(jù)庫生成的,則session.save()時(shí)并不會(huì)發(fā)出SQL語句,只有flush時(shí)才會(huì)發(fā)出SQL主鍵生成策略是native生成的,則session.save的同時(shí)就發(fā)出SQL。在flush時(shí)會(huì)滿不在緩存。實(shí)體對象只有發(fā)SQL句保存在數(shù)據(jù)庫中時(shí),session中的existsInDatabase會(huì)true. 數(shù)據(jù)庫的級別:并發(fā)性作用1、 2、ReadCommited(提交讀):只有提交后才可以讀,常用級 YYYReadCommited(提交讀NYRepeatableRead(可重復(fù)讀NNY臟讀:沒有提交就可以到數(shù)據(jù)稱為臟不可重復(fù)讀:再重復(fù)讀一次,數(shù)據(jù)與的不一樣。稱不可重復(fù)讀Mysql查看數(shù)據(jù)庫級別方法:select方法:selectMysql數(shù)據(jù)庫修改級別例如:修改為未提交讀:settransactionisolationlevel 方法:settransactionisolationlevel例如:修改為未提交讀:settransactionisolationlevel Session.evict(user)但是與commitsession=HibernateUtils.getSession();tx=session.beginTransaction();User1user=但是與commitsession=HibernateUtils.getSession();tx=session.beginTransaction();User1user=newUser1(); 無法成功提交,因?yàn)閑在清理緩存時(shí),在n的臨時(shí)集合)中取出r對象進(jìn)行rt操作后需要更新es屬性中的ae為,而我們采用t已經(jīng)將i解決在逐出session一對多關(guān)聯(lián)單向(one-to-id:name:id:name:Stringstudents:id:name:id:name:Stringstudents: 1121多對一關(guān)聯(lián):在多的一端加入一個(gè)外鍵指向一的一端,它的關(guān)系是多指向一的。一對多關(guān)聯(lián):在多的一端加入一個(gè)外鍵指向一的一端,它的關(guān)系是一指向多的。publicpublicclass{privateintprivateStringpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}}publicpublicclass{privateintprivateString privateSetpublicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}}Student文件><idname="id"<generator<propertyname="name" Classes文件><idname="id"<generator<propertyname="name" class="com.wjt276.hibernate.Student")--<set<key<<one-to-many 導(dǎo)出至數(shù)據(jù)庫hbddl)生成的SQL語句createcreatetablet_classes(idintegernotnullauto_increment,namevarchar(255),primarykey(id))createtablet_student(idintegernotnullauto_increment,namevarchar(255),classesidinteger,primarykey(id))altertablet_studentaddindexFK4B90757070CFE27A(classesid),addFK4B90757070CFE27Aforeignkey(classesid)referencest_classes一對多單 sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Studentstudent1=newStudent(); Studentstudent2newStudent(); Set<Student>students=newHashSet<Student>();Classesclasses=newClasses();生成的SQLHibernate:insertintot_student(name)values(?)Hibernate:insertintot_student(name)values(?)Hibernate:insertintot_classes(name)values(?)Hibernate:Hibernate:insertintot_student(name)values(?)Hibernate:insertintot_student(name)values(?)Hibernate:insertintot_classes(name)values(?)Hibernate:updatet_studentsetclassesid=?whereid=?Hibernate:updatet_studentsetclassesid=?where一對多,在一的一端關(guān)系的缺點(diǎn)sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Classesclasses=(Classes)session.load(Classes.class,2);System.out.println("="+classes.getName());Set<Student>students=classes.getStudents();for(Iterator<Student>iter=students.iterator();iter.hasNext();){Studentstudent=iter.next();System.out.println(student.getName());}加載生成SQLHibernate:Hibernate:selectclasses0_.idasid0_0_,classes0_.nameasname0_0_fromt_classesclasses0_whereclasses0_.id=?Hibernate:selectstudents0_.classesidasclassesid1_,students0_.idasstudents0_.idstudents0_.idasid1_0_,students0_.nameasname1_0_fromt_studentstudents0_一對多關(guān)聯(lián)雙向(one-to-學(xué)生文件修改后的><idname="id"<generator<propertyname="name" <many-to-onename="classes" 一對多sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Classesclasses=newClasses();Studentstudent1=newStudent();Studentstudent2newStudent();生成SQLHibernate:Hibernate:insertintot_classes(name)valuesHibernate:insertintot_student(name,classesid)values(?,?)Hibernate:insertintot_student(name,classesid)values(?,注意:一對多,從多的一端保存數(shù)據(jù)比從一的一端保存數(shù)據(jù)要快,因?yàn)閺囊坏囊欢吮4鏀?shù)據(jù)時(shí),會(huì)多更新多的一端的一個(gè)外鍵(是指定一的一端的。)如果在一對多的關(guān)系中采用一的一端來關(guān)系的話會(huì)存在以下兩個(gè)缺點(diǎn):①如果多的一端那個(gè)外鍵設(shè)置為非空時(shí),則多的一端就存不進(jìn)數(shù)據(jù);②會(huì)發(fā)出多于的Upte語句,這樣會(huì)影響效率。所以常用對于一對多的關(guān)系我們在多的一端關(guān)系,并讓多的一端關(guān)系失效(見下面屬性)。><idname="id"<generator<propertyname="name" 關(guān)系失效(反轉(zhuǎn)):false:可以從一的一端 <setname="students"<key<one-to-many 關(guān)于inverseinverse主要用在一對多和多對多雙向關(guān)聯(lián)上,inverse可以被設(shè)置到集合<set>上,默認(rèn)inverse為Inverse和cascade一對多雙向關(guān)聯(lián)總結(jié)多對多關(guān)聯(lián)單向(many-to-id:name:id:name:Stringrolles:Setid:name:id:name:Stringrolles:Set t_user_role(第表,表 1|1|11|2|1|22|3|2|23|2|33|13|23|3publicpublicclass{privateintid;privateStringname;publicintgetId()return}publicvoidsetId(intid)this.id=}publicpublicStringgetName()return}publicvoidsetName(Stringname)=}}publicpublicclass{privateintprivateStringprivateSetroles;//Role對象的集publicintgetId()return}publicvoidsetId(intid)this.id=}publicStringgetName()return}publicvoidsetName(Stringname)=}publicSetgetRoles()return}publicvoidsetRoles(Setroles)this.roles=}}Role文件><id<generator<propertyname="name" User文件><<idname="id"<generator<property 集合 中的name值為對象屬性名(集合roles),而使用table屬性 所以表 并且使用column屬性加入一個(gè)外鍵指向Role實(shí)體類所對應(yīng)的表(t_role)--><setname="roles"<key 導(dǎo)出至數(shù)據(jù)庫表所生成SQLcreatecreatetablet_role(idintegernotnullauto_increment,namevarchar(255),primarykey(id))createtablet_user(idintegernotnullauto_increment,namevarchar(255),primarykey(id))createtablet_user_role(useridintegernotnull,roleidintegernotnull,primarykey(userid,roleid))altertablet_user_roleaddindexFK331DEE5F1FB4B2D4(roleid),addconstraintFK331DEE5F1FB4B2D4foreignkey(roleid)referencest_role(id)altertablet_user_roleaddindexFK331DEE5F250A083E(userid),addFK331DEE5F250A083Eforeignkey(userid)referencest_user注:根據(jù)DDL語句可以看出第表的主鍵是一個(gè)復(fù)合主鍵(primarykey(userid,roleid)),也就是說記錄不 sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Roler1=newRole(); Roler2=newRole();Roler3=newRole();Useru1=newSet<Role>u1Roles=newHashSet<Role>();Useru2newUser();Set<Role>u2Roles=newHashSet<Role>();Useru3=newUser(); Set<Role>u3Roles=newHashSet<Role>();發(fā)出SQLt_role(name)valuest_role(name)valuest_role(name)valuest_user(name)valuest_user(name)valuest_user(name)valuest_user_role(userid,t_user_role(userid,t_user_role(userid,t_user_role(userid,t_user_role(userid,t_user_role(userid,Hibernate:insertintot_user_role(userid,roleid)values(?,注:前三條SQL語句,添加Role記錄,第三條到第六條添加User,最后7條SQL語句是在向第多對多關(guān)聯(lián)單向數(shù)據(jù)加載sessionsession=HibernateUtils.getSession();tx=session.beginTransaction();Useruser=(User)session.load(User.class,1);System.out.println("="+user.getName());for(Iterator<Role>iter=user.getRoles().iterator();iter.hasNext();){Rolerole=(Role)iter.next();}Hibernate:Hibernate:selectuser0_.idasid0_0_,user0_.nameasname0_0_fromt_useruser0_whereuser0_.id=?Hibernate:selectroles0_.useridasuserid1_,roles0_.roleidasroleid1_,role1_.idasid2_0_,role1_.nameasname2_0_fromt_user_roleroles0_leftouterjoint_rolerole1_onroles0_.roleid=role1_.idwhereroles0_.userid=?多對多關(guān)聯(lián)雙向(many-to-><id<generator<propertyname="name"<!—order-by屬性是 <setname="users"table="t_user_role"order-<key 雙向數(shù)據(jù)加session=HibernateUtils.getSession();tx=session.beginTransaction();Rolerole=(Role)session.load(Role.Rolerole=(Role)session.load(Role.class,1);System.out.println("="+role.getName());for(Ite
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅行社之間合作協(xié)議
- 美蘇技術(shù)合作協(xié)議
- 2025版施工合同放棄及回函流程規(guī)范3篇
- 2025版智能交通管理系統(tǒng)安全生遵守協(xié)議書3篇
- 2025版小額貸款合同簽訂中的合同簽訂中的合同解除權(quán)與條件2篇
- 2025年全球及中國不銹鋼晶圓環(huán)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國閉芯變壓器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國鋁角行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球絲束預(yù)浸料設(shè)備行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025版施工現(xiàn)場安全生產(chǎn)管理及應(yīng)急救援服務(wù)合同2篇
- 2024年08月北京中信銀行北京分行社會(huì)招考(826)筆試歷年參考題庫附帶答案詳解
- 原發(fā)性腎病綜合征護(hù)理
- (一模)株洲市2025屆高三教學(xué)質(zhì)量統(tǒng)一檢測 英語試卷
- 蘇教版二年級數(shù)學(xué)下冊全冊教學(xué)設(shè)計(jì)
- 職業(yè)技術(shù)學(xué)院教學(xué)質(zhì)量監(jiān)控與評估處2025年教學(xué)質(zhì)量監(jiān)控督導(dǎo)工作計(jì)劃
- 金字塔原理與結(jié)構(gòu)化思維考核試題及答案
- 基礎(chǔ)護(hù)理學(xué)導(dǎo)尿操作
- 臨床放射性皮膚損傷的護(hù)理
- DB11∕T 1028-2021 民用建筑節(jié)能門窗工程技術(shù)標(biāo)準(zhǔn)
- 四川省成都市溫江區(qū)2023-2024學(xué)年四年級下學(xué)期期末語文試卷
- (初級)航空油料計(jì)量統(tǒng)計(jì)員技能鑒定理論考試題庫(含答案)
評論
0/150
提交評論