Hibernate知識點(diǎn)總結(jié)_圖文_第1頁
Hibernate知識點(diǎn)總結(jié)_圖文_第2頁
Hibernate知識點(diǎn)總結(jié)_圖文_第3頁
Hibernate知識點(diǎn)總結(jié)_圖文_第4頁
Hibernate知識點(diǎn)總結(jié)_圖文_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、簡介hibernate是一個開放源代碼的對象關(guān)系映射框架,它對jdbc進(jìn)行了非常輕 量級的對象封裝,使得java程序員可以隨心所欲的使用對象編程思維來操縱數(shù) 據(jù)庫。hibernate可以應(yīng)用在任何使用jdbc的場合,既可以在java的客戶端 程序使用,也可以在servlet/jsp的web應(yīng)用中使用hibernate 優(yōu)點(diǎn)1、封裝了 jdbc,簡化了很多重復(fù)性代碼。2、簡化了 dao層編碼工作,使開發(fā)更對彖化了。3、移植性好,支持各種數(shù)據(jù)庫,如果換個數(shù)據(jù)庫只要在配置文件中變換配 置就可以了,不用改變hibernate代碼。4、支持透明持久化,因?yàn)閔ibernate操作的是純粹的(pojo) j

2、ava類,沒 有實(shí)現(xiàn)任何接口,沒有侵入性。所以說它是一個輕量級框架關(guān)聯(lián)映射知識點(diǎn)對于多表外鍵的添加,即上一級是下級的外鍵,包含是被包含的外鍵!少的是多的外鍵,一對多雙向關(guān)聯(lián)在關(guān)聯(lián)映射一對多的的持久化類中,多類(下級)中要包含單類(上級)對象的getset方法,其多類 的映射文件要添加<many-to-one name="單持久化類所在本持久化類屮的對象名"column ="多類 表的外鍵“ class=持久化類的完整路徑 />單類(上級)屮要添加set容器的getset方法其單類的配置文件要添加<sct namc="sct 的對象名”&

3、lt;key column="多類表的外鍵"/><one-to-many class="多持久化類的完整路徑"/></set>對象只要沒new都不算是創(chuàng)建該類對象一對一雙向關(guān)聯(lián)關(guān)系在關(guān)聯(lián)映射中雙方都耍添加對方持久化類的getset方法并且配置如下<many-to-one name 對方持久化類所在本持久化類屮的對彖名'' column=”關(guān)聯(lián)的外鍵m對方持久化類的完整路徑"unique= "true"</many-to-one>另一方< one-to-on

4、e name = ''對方持久化類所在本持久化類中的對彖名“ class=對方持久化類的完整路徑"property- ref ="本持久化類在對方持久化類屮的 對象名'' 1>關(guān)聯(lián)映射的級聯(lián)cascade級聯(lián)的作用就是在操作一個持久化類里也影響關(guān)聯(lián)的持久化類比如,保存一個區(qū)的信息,也把這個區(qū)的所有街道保存在數(shù)據(jù)庫里!多對多雙向關(guān)聯(lián)映射建立中間表sc,中間表和兩個表的關(guān)系是多對一的關(guān)系在兩個表的持久化類中建立各自的set容器,并創(chuàng)建setget方法在配置文件中配置如下<set name= ''木持久化類中set的變量

5、名” table= ''sc中間表的名稱''cascade= nsave-update"><key column="屮間表和本表建立的外鍵字段叩>< many -1 o - many對方表持久化類的完整路徑'' column= “中間表和對方表建立的外鍵字段/></set>hibernate的集中查詢方式1 session 方式通過get () load ()根據(jù)id杳詢指定的對象(session0hibernatetemplate相比沒有f ind()方法)2.hql查詢方式通過qu

6、ery接口使用hql語言進(jìn)行査詢3criteria方式使用criteria等接口和類進(jìn)行查詢s4本地sql查詢方式使用原生sql語言進(jìn)行查詢5 hibernatetemplateffihibcmatctcmplatc提供非常多的常用方法來完成基木的操作,比如通常的增加、刪除、修改、 杳詢等操作,下血是hibematetemplate的常用方法簡介:1. delete(object entity):刪除指定持久化實(shí)例2. deleteall(collection entities):刪除集合內(nèi)全部持久化類實(shí)例3. find(string querystring):根據(jù)hql查詢7符串來返回實(shí)例集

7、合4. findbynamedquery(string query name):根據(jù)命名杳詢返 i 叫實(shí)例集合5. get(class entityclass, serializable id):根據(jù)主鍵加載特定持久化類的實(shí)例6. save(object entity):保存新的實(shí)例7. savcorupdatc(objcct entity):根據(jù)實(shí)例狀態(tài),選擇保存或者更新& update(object entity):更新實(shí)例的狀態(tài),要求entity是持久狀態(tài)9. setmaxresults(int maxresults):設(shè)置分頁的大小10.1oad(class entitycla

8、ss, serializable id)11.iteratehql講解1實(shí)體查詢獲取返回結(jié)果的三種方式1list ()返冋所用信息的list的對彖拓展:iterator iteratoi-query.list().iterator();2 iterate ()方法iterator iterator=query.iterate();同樣返回一個結(jié)果集,區(qū)別在與和丄ist杳詢的機(jī)制不一樣,具體查詢資料3uniqueresult ()返回指定的單一的信息query query=session.createquery (nfran student where sid=11070130");

9、student stu= (student)query.uniqueresult ();sys ten oirt.println(stu.getsid() + h "+ stu .getsnane ();2屬性查詢的兩種方法通過直接指定屬性進(jìn)行查詢屬性查詢(投影查詢)只查詢持久化類的部分屬性而不是全部屬性0屬性查詢方式通過直接抬定屬性進(jìn)行屬性查詢string hql 二”select sid,sname from student"list的金個元鸞定一個對1數(shù)組query query二session.ceatequey(hql); list list = query.lis

10、t();iterator it = list.iterator();while(it.hasnext()object obj=(object)it.next();system.out.println(obj0+n "+ obj1); 通過構(gòu)造方法進(jìn)行查詢通過構(gòu)造方進(jìn)進(jìn)行屬性查詢string hql 二”select new student(sid.sname) from student"query query=session.createquery(hql);list list = queryist();iterator it = list.iterator(); whil

11、e(it.hasnext()student stu=(student)it.next();system.out. println(stu.getsid()+nh+stu.getsname();需耍為持久住類提供枸應(yīng)的構(gòu)港方進(jìn)后者方法更曲用!3實(shí)體的更新和刪除實(shí)體更新string hql =*叩date student set sname*趙斐,where sid= 11070130";query query=session.createquery(hql);int n =query.executeupdate();調(diào)用executeupdate()實(shí)現(xiàn)更新實(shí)體刪除111string

12、hql =hdelete from student where sid= 11070130" query query=session.ceeatequeey(hql);int n =query.executeupdate();調(diào)用executeupd日te()實(shí)現(xiàn)刪除4參數(shù)綁定1使用?占位符int jld=3, |coilrigmanager config =new configmanager ();session session=config.config();tr ans act ion tran=session.begintrans action(); string liql=

13、 nfrom student where | sjld= 9 ;query que:ry= session. creat.equery(bql);query jsetp ammeter ( 0 , jld);student student = (student) query uniqueresult();system, out.print in(student.get sname()+student.get sex(); sessionclose();2使用命名參數(shù)string name ="趙飛';string hql =ufrom student where sname=

14、:snameh; query query=session.createquery(hql); querysetsthagrsnarnej name);/query.setparameter(nsname>i/ name); list<student> list = queryjist();setparameter()綁定任意類型的參數(shù)5.hql 與 sqlhql的排序方式和分組和sql語句大同小異order by asc 升序desc卩筆序group by havinghql的統(tǒng)計函數(shù)和sql語言的統(tǒng)計函數(shù)大同小異avg()sum()min()max()count()coun

15、t ()返回結(jié)杲是long類型其他三個返冋結(jié)果是對象數(shù)組分頁使用hibernate query接口的兩個方法就口j以實(shí)現(xiàn)分頁setfirstresult ()設(shè)置一頁屮第一條記錄的編號setmaxresult ()設(shè)置一頁可以容納的記錄條數(shù)子查詢,連接查詢hql的子查詢,連接查詢和sql的子查詢方式相同區(qū)別session和query的區(qū)別session接口是hibernate先應(yīng)用程序提供的操作數(shù)據(jù)庫的最主要的接口,它提供基本的保存, 更新,刪除,和加載java對象的方法query解耦接口是hql查詢接口,提供了各種查詢功能比如list()更新和刪除的方法executeupdate();還有分

16、貝的方法hibernatetemplate 與 session 的區(qū)別口動牛成hibernate配置文件的時候,會在dao層用到getsession ()方法來 操作數(shù)據(jù)庫記錄,但是他還冇個方y(tǒng)gethibernatetemplate (),這兩個方 法究竟有什么區(qū)別呢?1 ffijtlgetsession ()力法傷丿1 要繼承sessionfactory,而使用 gethibernatetemplate ()方法丿必須繼承 hib巳rna匸巳daosupport:當(dāng)然包 sessionfactory,這點(diǎn)區(qū)別都不是特別重要的,下面這些區(qū)別就很重要 t2 .getsession ()方法是沒

17、有經(jīng)過spring包裝的,spring會把最原始的 session給你,在使用完之后必須自己調(diào)用相應(yīng)的close方法,而且也不會對 聲明式事務(wù)進(jìn)行相應(yīng)的管理,一旦沒有及時關(guān)閉連接,就會導(dǎo)致數(shù)據(jù)庫連接池的 連接數(shù)溢 出,gethibernatetemplate ()方法是經(jīng)過spring封裝的,例如 添加相應(yīng)的聲明式事務(wù)管理,由spring管理相應(yīng)的連接。在實(shí)際的使用過程中發(fā)現(xiàn)的確gethibernatetemplate ()比getsession () 方法要好很多,但是有些方法在gethibernatetemplate ()并沒有提供,這 時我們用hibernatecallback回調(diào)的方法

18、管理數(shù)據(jù)庫我們使hibernatetemplate,有一個很重要的原因就在于我們不想直接 控制事務(wù),不想直接去獲取,打開session,開始一個事務(wù),處理異常,提交 一個事務(wù),最后關(guān)閉一個sessionhibernatetemplate 是hibernate操作 進(jìn)行封裝,我們只要簡單的條用hibernatetemplate對象,傳入hql和參數(shù), 就獲得查詢接口,至于事務(wù)的開啟,關(guān)閉,都交nhibernatetemplate對 象來處理我們自己只專注于業(yè)務(wù),不想去作這些重復(fù)而繁瑣的操作。我們把這些 責(zé)任全部委托給了 hibernatetemplate,然后使用聲明式的配置來實(shí)現(xiàn)這樣 的功能。

19、如果我們通過類似getsession ()這樣的方法獲得了session,那就 意味著我們放棄了上面所說的一切好處。gethibernatetemplate.load()和 get()之間 的區(qū)別主要的地方:gethibernatetemplate.load()存在延遲加載問題。gethibernatetemplate.get()不存在此問題,不采用lazy機(jī)制的。1當(dāng)記錄不存在時候,get方法返inin ulljoad方法產(chǎn)主異常,即get()可以取空的數(shù)據(jù)集,但 load()不行2 load方法可以返回實(shí)體的代理類,get方法則返回真是的實(shí)體類3 load方法可以充分利用hibernate

20、的內(nèi)部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法僅僅 在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如果沒有發(fā)現(xiàn)數(shù)據(jù)則將越過二級緩存,直接調(diào)用sql查詢數(shù)據(jù)庫。4也許別人把數(shù)據(jù)庫小的數(shù)據(jù)修改了,load如何在緩存屮找到了數(shù)據(jù),則不會再訪問數(shù)據(jù) 庫,而get則會返回最新數(shù)據(jù)。gethibernatetemplate.find()和 iterate()之 間的區(qū)別find和iterato的區(qū)別主要是iterate采用了 n+1次查詢,對于人批量查詢,比如查詢10000 條記錄,那么iterate就要執(zhí)行10000+1次查詢,find和iterate應(yīng)根據(jù)具體的實(shí)際情況來使 川,對于頻繁的寫操作對彖,應(yīng)使川find查詢,

21、而對于一些只讀的數(shù)據(jù)對彖,應(yīng)使用iterate 操作,因?yàn)閕terate操作使用了 hibernate的緩存機(jī)制opensession 與 getcurrentsession 區(qū)別gctcurrcntscssion創(chuàng)建的線程會在事務(wù)回滾或事物提交后自動關(guān)閉,而opensession必須手動 關(guān)閉getcurrentsession ()使用當(dāng)前的 sessionopensession()重新建立一個新的session在一個應(yīng)用程序中,如果dao層使用spring的hibernate模板,通過spring來控制session 的生命周期,貝ij首選getcurrentsession ()。crit

22、eria 查詢criteria查詢乂叫對象杳詢,它采用對象的方式封裝查詢條件并提供了 restrictions等類型做類 型輔助創(chuàng)建的代碼如下criteria criteria =session.createcriteria(login.class)restrictions限制結(jié)果集內(nèi)容criteria.add(restrictionseq("name'',''tom'')查詢用戶名為 tom 的用戶信息結(jié)果排序criteria.addorder(order.desc(44agem);按照年齡降序排序更多的限制條件請參閱相關(guān)的資料使用p

23、rojection(投影)是西南sql語句中的函數(shù)功能projection.rowcount()統(tǒng)計記錄數(shù)avg()求平均值 criteria.setprojection(projections.rowcount()list list criteria.list();system.oih.println("記錄數(shù)"+list.iterato r.next();/更多的限制條件請參閱相關(guān)的資料還有一種方式是本地sql,見資料分頁setfirstresult ()設(shè)置一貝中第一條記錄的編號setmaxresult ()設(shè)置一頁口j以容納的記錄條數(shù)hibernate調(diào)用存儲過程在

24、軟件開發(fā)的過程中會遇到一些復(fù)雜的數(shù)據(jù)庫操作,如果在應(yīng)用層實(shí)現(xiàn)這些操作會非常的繁 瑣,這時候就會調(diào)用數(shù)據(jù)庫里面的存儲過程hibernate調(diào)用存儲過程有常用的兩種方式1. 使用命名sql調(diào)用存儲過程2. 使用callablestatement調(diào)用存儲過程具體請杳看相關(guān)代碼緩存簡介級緩存當(dāng)應(yīng)用程序調(diào)用 session 的 save()、update () > saveorupdate () > get ()或 load0 ,以及調(diào)用查詢接口的list () > iterate0或filter()方法時,如果在 session緩存中還不存在和應(yīng)的對象hibernate就會把該對象加

25、入到第一級緩 存中。當(dāng)清理緩存時,hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù) 庫。session為應(yīng)用程序提供了兩個管理緩存的方法:evict (object obj): 從緩存中清除參數(shù)指定的持久化對象。clear():清空緩存中所有持久化對象。二級緩存3. 1. hibernate的二級緩存策略的一般過程如下:1) 條件查詢的時候,總是發(fā)出一條select * from table_name where. (選擇所冇字段)這樣的sql語句查詢數(shù)據(jù)庫,一次獲得所冇的數(shù)據(jù)對象。2) 把獲得的所有數(shù)據(jù)對彖根據(jù)id放入到第二級緩存中。3) 當(dāng)hibernate根據(jù)id訪問數(shù)據(jù)對象的

26、時候,首先從session 級緩存中 查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數(shù)據(jù) 庫,把結(jié)果按照id放入到緩存。4) 刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。hibernate的二級緩存策略,是針對于td查詢的緩存策略,對于條件查詢則 毫無作用。為此,hibernate提供了針對條件查詢的query cacheo3.2.什么樣的數(shù)據(jù)適合存放到第二級緩存中? 1很少被修改的數(shù)據(jù)2不 是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)3不會被并發(fā)訪問的數(shù)據(jù)4參考數(shù) 據(jù),指的是供應(yīng)用參考的常量數(shù)據(jù),它的實(shí)例數(shù)目有限,它的實(shí)例會被許多其他 類的實(shí)例引用,實(shí)例極少或者從來不會被修改。3

27、. 3.不適合存放到第二級緩存的數(shù)據(jù)? 1經(jīng)常被修改的數(shù)據(jù)2財務(wù)數(shù) 據(jù),絕對不允許出現(xiàn)并發(fā)3與其他應(yīng)用共享的數(shù)據(jù)。3.4.常用的緩存插件hibernatcr的二級緩存是一個插件,下面是幾種常 用的緩存插件:1 ehcache:可作為進(jìn)程范圍的緩存,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或碩 盤,對hibernate的查詢緩存提供了支持。1 oscachc:可作為進(jìn)程范圍的緩存,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或硬 盤,捉供了豐富的緩存數(shù)據(jù)過期策略,對hibernate的查詢緩存捉供了支持。1 swarmcache:可作為群集范國內(nèi)的緩存,但不支持hibernate的查詢緩存。1 jbosscachc:可作為

28、群集范圍內(nèi)的緩存,支持事務(wù)型并發(fā)訪問策略,對 hibernate的查詢緩存提供了支持。核心接口和類|llmx*jia4l匚hibernate 的核心類和接口共有 6 個,分別為:session、sessionfactory>transaction> query> criteria 和 configuration。這 6 個核心和類接口在任何 開發(fā)中都會用到。通過這些接口,不僅可以對持久化對象進(jìn)行存取,還能夠進(jìn)行 事務(wù)控制。下面對這6個核心接口和類分別加以介紹sessionsession接口負(fù)責(zé)執(zhí)行被持久化對象的crud操作(crud的任務(wù)是完成與數(shù)據(jù) 庫的交流,包含了很多常見

29、的sql語句。)。但需要注意的是session對象是非 線程安全的。同時,hibernate的session不同于jsp應(yīng)用中的httpsession。這里當(dāng)使用session這個術(shù)語時,jt實(shí)指的是hibernate屮的session, jfij以后 會將httpsession對象稱為用戶session。sessionfactorysessionfactory接口負(fù)責(zé)初始化hibernate。它充當(dāng)數(shù)據(jù)存儲源的代理,并 負(fù)貴創(chuàng)建session對象。這里用到了工廠模式。需要注意的是sessionfactory 并不是輕量級的,因?yàn)橐话闱闆r廠一個項(xiàng)目通常只需要一個sessionfactory 就

30、夠,當(dāng)需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個sessionfactory。tran sacti ontransaction接口是一個口j選的apt,可以選擇不使用這個接口,取而代之 的是hibernate的設(shè)計者自己寫的底層事務(wù)處理代碼。transaction接口是對 實(shí)際事務(wù)實(shí)現(xiàn)的一個抽象,這些實(shí)現(xiàn)包括jdbc的事務(wù)、jta中的 usertransaction甚至口j以是c0rba事務(wù)。之所以這樣設(shè)計是能讓開發(fā)者能夠 使用一個統(tǒng)一事務(wù)的操作界面,使得自己的項(xiàng)目可以在不同的環(huán)境和容器之間方 便地移植。queryquery接口讓你方便地對數(shù)據(jù)庫及持久對象進(jìn)行查詢,它可以有兩種表達(dá)方 式:

31、hql語言或本地數(shù)據(jù)庫的sql語句。query經(jīng)常被用來綁定查詢參數(shù)、限制 查詢記錄數(shù)量,并最終執(zhí)行查詢操作。criteriacriteria接口與query接口非常類似,允許創(chuàng)建并執(zhí)行面向?qū)﹀璧臉?biāo)準(zhǔn)化查 詢。值得注意的是criteria接口也是輕量級的,它不能在session之外使用。con figuratio nconfiguration類的作用是對hibernate進(jìn)行配置,以及對它進(jìn)行啟動。在 hibernate的啟動過程屮,configuration類的實(shí)例首先定位映射文檔的位置, 讀取這些配置,然后創(chuàng)建一個sessionfactory對象。雖然configuration類在 整個h

32、ibernate項(xiàng)目中只扮演著一個很小的角色,但它是啟動hibernate時所 遇到的每-個對象。hibernate的檢索策略立即檢索,延遲檢索,迫切左外連接檢索檢索的作用域,類級別的檢索和關(guān)聯(lián)級別的檢索默認(rèn)檢索策略都是延遲檢索合理的選擇檢索策略可提升軟件運(yùn)行性能,合理運(yùn)用硬件資源 設(shè)置屬性lazy的值(檢索屬性) 批量檢索batch-size (檢索屬性)作用:設(shè)置批量檢索的數(shù)量,可以減少select語句數(shù)量,提高檢索性能 batch-size默認(rèn)值為1最佳取值2-10,次查詢2 -10個班級的數(shù)據(jù), fetch配置(檢索屬性)用來表示關(guān)聯(lián)對象吋查詢語句的形式,以及加載關(guān)聯(lián)對象的吋機(jī),取值:

33、select:加載關(guān)聯(lián)對象時通過select語句實(shí)現(xiàn),默認(rèn)值subselect加載關(guān)聯(lián)對象時通過帶子查詢語句實(shí)現(xiàn)join采用迫切左外連接檢索所冇關(guān)聯(lián)對彖hibernate注解方法使用總結(jié)hibernate提供/ hibernate annotations擴(kuò)展包,他叫以替換復(fù)雜的hbm.xml文件,使得 hibernate程序開發(fā)大大簡化,即使用注解后,可不適用特定持久化類對應(yīng)的乞hbm.xml文件,而 直接已注解的方式寫入在持久化類中的實(shí)現(xiàn).詳細(xì)實(shí)現(xiàn)請參閱相關(guān)的代碼!1. 類級別注解entity 映射實(shí)體類table映射數(shù)句庫表entity(name="tablename"

34、)-必須,注解將一個類聲明為一個實(shí)體可選,對應(yīng)數(shù)據(jù)庫中的一個表。若表名與實(shí)體類名相同,則可以省略。table(name="m,catalog="n,schema="m)-可選,通常和entity配合使用,只能標(biāo)注在實(shí)體 的class定義處,表示實(shí)體對應(yīng)的數(shù)據(jù)庫表的信息。屬性:name 可選,表示表的名稱,默認(rèn)地,表名和實(shí)體名稱一致,只有在不一致的情況下才 需 要指定表名catalog -可選,表示 catalog 名稱,默認(rèn)為 catalog").schema -可選,表示schema名稱,默認(rèn)為schema("")

35、.2. 屬性級別注解id 映射牛成主鍵version 定義樂觀鎖column 映射表的列transient定義暫態(tài)屬性2.1與主鍵相關(guān)注解id 必須,定義了映射到數(shù)據(jù)庫表的主鍵的屬性,一個實(shí)體只能有一個屬性被映射為 主 鍵,置于gctxxxx()前。generatedvalue(strategy=generationtype,generator=,h,)-可選,用于定義主鍵生成策略。 屬性:strategy -表示主鍵生成策略,取值有:generationtype.auto -根據(jù)底層數(shù)據(jù)庫h動選擇(默認(rèn)),若數(shù)據(jù)庫支持h 動增長類型,則為自動增長。generationtype.indenti

36、ty根據(jù)數(shù)據(jù)庫的identity字段生成,支持 db2、 mysqlms、sql server> sybase 與 hyperanoicsql 數(shù)據(jù)庫的 identity類型主鍵。gcncrationtypc.sequence -使用 sequence 來決定主鍵的取值,適合 oracle、db2 等支持sequence的數(shù)據(jù)庫,一*般結(jié)合sequencegenerator使用。(oracle沒有自動增長類型,只能用sequence)generationtype.table 使用指定表來決定主鍵取值,結(jié)合tablegenerator使川。 如:idtablegenerator(name=

37、htab_cat_gen,allocationsize= 1)gcncratcdvaiuc(stratcgy=gc ncrationtypc.tablc)generator 表示主鍵牛成器的名稱,這個屬性通常和orm框架和關(guān),例如:hibernate可以指定uuid等主鍵生成方式scqucnccgcncrator 一注解聲明f 一個數(shù)據(jù)庫序列。屬性:name 表示該表主鍵牛.成策略名稱,它被引用在generatedvalue中設(shè)置的ugerneratorv值 中。sequencename -表示生成策略用到的數(shù)據(jù)庫序列名稱。initialvalue -表示主鍵初始值,默認(rèn)為0.allocati

38、onsize-每次主鍵值增加的大小,例如設(shè)置成1,則表示毎次創(chuàng)建新記錄后口動加1, 默認(rèn)為50.示例:idgeneratedvalues(strategy=strategytype.sequence)public int gctpk() return pk;hibernate的訪問類型為field時,在字段上進(jìn)行注解聲;訪問類型為property時,在getter方法上進(jìn)行注釋聲明。2.2與非主鍵相關(guān)注解version可以在實(shí)體bean屮使)|jversion注解,通過這種方式可添加對樂觀鎖定的支持basic -用于聲明屬性的存取策略:basic(fetch=fetchtype.eager)即

39、吋獲取(默認(rèn)的存取策略) basic(fetch=fetchtype.lazy)延遲獲収temporal -用于定義映射到數(shù)據(jù)庫的時間精度:tcmporal(tcmporaltypc=date) u 期temporal(temporaltype=time) 時間temporal(temporaltype=timestamp)兩者兼貝column -可將屬性映射到列,使用該注解來覆蓋默認(rèn)值,column描述了數(shù)據(jù)庫表 小該字段的詳細(xì)定義,這對于根據(jù)jpa注解生成數(shù)據(jù)庫表結(jié)構(gòu)的工具非常有作用。屬性:可選,表示數(shù)據(jù)庫表中該字段的名稱,默認(rèn)情形屬性名稱一致nullable 可選,表示該字段是否允許為n

40、ull,默認(rèn)為trueunique -可選,表示該字段是否是唯一標(biāo)識,默認(rèn)為falselength -可選,表示該字段的大小,僅對string類型的字段冇效,默認(rèn)值255.insertable -可選,表示在0rm框架執(zhí)行插入操作吋,該字段是否應(yīng)出現(xiàn)insetrt語句中,默認(rèn)為trueupdateable 可選,表示在0rm框架執(zhí)行更新操作時,該字段是否應(yīng)該出現(xiàn)在update語句中,默認(rèn)為true.對于一經(jīng)創(chuàng)建就不可以更改的字段,該 屬性非常有用,如對于birthday字段。columndefinition對選,表示該字段在數(shù)據(jù)庫中的實(shí)際類型。通常orm框架可以根 據(jù)屬 性類型自動判斷數(shù)據(jù)庫屮

41、字段的類型,但是對于date類型仍無法確定數(shù)據(jù)庫屮字段類型究竟是date,time還是timestamp.此外,string的默認(rèn)映射類型為varchar,如果 耍將string類型映射到特定數(shù)據(jù)庫的blob或text字段類型,該屬性非常有用。 示例:column(name="birth',nullable=,'false',colu mn definition 二"date")public string getbithdayo return birthday;transient"j選,表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,o

42、rm框架將忽略該屬性, 如果一個屬性并非數(shù)據(jù)庫表的字段映射,就務(wù)必將其標(biāo)示為©transient,否則orm框架默 認(rèn)其注解為basic示例:/根據(jù)birth計算出age屬性transie ntpublic int getage() return getyear(new date() - getyear(birth);column(na!ne : "date")private string date;/private list<resourcesform> children : new arraylist<resourcesform>()j

43、public list<resourcesform> getchildren()return children;public void setchildren(list<re5ourcesform> children)this.children : children;*/transientprivate list<resourcesform> children = new arraylist<resourcesform>();23無注解屬性的默認(rèn)值 如果屬性為單一類型,則映射為basic, 否則,如果屬性對應(yīng)的類型定義了embeddable注解,

44、則映射為embedded,否則,如果屬性對應(yīng)的類型實(shí)現(xiàn)了 serializable,則屬性被映射為basic并在一個列中保存該 對象的serialized版本,否則,如果該屬性的類型為java.sql.clob或java.sql.blob,則作為lob并映射到適當(dāng)?shù)?lobtypc. o3. 映射繼承關(guān)系©inheritance注解來定義所選擇的策略.這個注解需要在每個類層次結(jié)構(gòu)(class hierarchy) 頂端的實(shí)體類上使用4. 映射實(shí)體bean的關(guān)聯(lián)關(guān)系4.1關(guān)聯(lián)映射的一些定義單向一對多:一方有集合屬性,包含多個多方,而多方?jīng)]有一方的引用。用戶電了郵件單向多對一:多方有一方

45、的引用,一方?jīng)]有多方的引用。論文類別類別雙向一對多:兩邊都有多方的引用,方便查詢。班級一 學(xué)牛雙向多對一:兩邊都有多方的引用,方便杏詢。單向多對多:需要一個中間表來維護(hù)兩個實(shí)體表。論壇文章單向一對一:數(shù)據(jù)唯一,數(shù)據(jù)庫數(shù)據(jù)也是一對一。艦船水手主鍵相同的一對一:使用同一個主鍵,省掉外鍵關(guān)聯(lián)??桶?地址單向:關(guān)系寫哪邊,就由誰管理。雙向:一般由多方管理。onetomany(mappedby=h對方“)反向配置,對方管理。4.2關(guān)聯(lián)映射的一些共冇屬性onetoone onetomany、manytoone、manytomany 的共有屬性:fetch -配置加載方式。取值有fetch.eager及時加

46、載,多對一默認(rèn)是fetch.eagerfetch.lazy 延遲加載,一對多默認(rèn)是fetch.lazycascade -設(shè)置級聯(lián)方式,取值有:cascadetype.persist -保存cascadetype.remove 刪除cascadetype.merge 修改cascadetype.refresh 刷新cascadetype.all -全部targetentity -配置集合屬性類型,如:onetomany(targetentity=book.class)joincolumn可選,用于描述一個關(guān)聯(lián)的字段。joincoluinn fllcolumn類似,介量描述的不是一個簡單字段,而是一個關(guān)聯(lián)字段,例如 扌甫述一個manytoone的字段。屬性:name 該?段的名稱,市于joincolumn描述的是一個關(guān)聯(lián)字段,如manytoone,則默認(rèn)的 名稱由其關(guān)聯(lián)的實(shí)休決定。例如,實(shí)體order有一個user屬性來關(guān)聯(lián)實(shí)體user,則ordci的us

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論