![馬士兵筆記分類hibernate09人閱讀評論13收藏舉報_第1頁](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee11.gif)
![馬士兵筆記分類hibernate09人閱讀評論13收藏舉報_第2頁](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee12.gif)
![馬士兵筆記分類hibernate09人閱讀評論13收藏舉報_第3頁](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee13.gif)
![馬士兵筆記分類hibernate09人閱讀評論13收藏舉報_第4頁](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee14.gif)
![馬士兵筆記分類hibernate09人閱讀評論13收藏舉報_第5頁](http://file4.renrendoc.com/view/37bc06175aea8dfbf988c046bbcfdee1/37bc06175aea8dfbf988c046bbcfdee15.gif)
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Hibernateannotation筆記馬士分類:hibernate2011-11-1809:5914997(13)收藏hibernatesessionstring12HibernateUML345第6課第一個示例HibernateoWorld7第7課建立Annotation版本的World9第8課什么是O/RMap11一 定義:.二 Hibernate的創(chuàng)始人:.三 Hibernate做什么:.四 Hibernate存在的原因:.五 Hibernate的優(yōu)缺點:.六 Hibernate使用范圍:.9Hibernate:Hibernate一、對象---關系映射模式.O/R10Hibernate(OR一 項目名稱.二 原代碼.11Hibernate一 提綱.二、MYSQL三、Hibernate.cfg.xml:hbm2ddl.auto16四、DDL16五、Junit16 ehibernate.cfg.xml:show_sql17 hibernate.cfg.xml:format_sql17 表名和類名不同,對表名進行配置.17九 字段名和屬性相同.十、字段名和屬性名不同.十一 不需要(持久化)psersistence的字段.十二 映射日期與時間類型,指定時間精度.十三 映射枚舉類型.12hibernate13ID一、Xml<generator>20二、annotateon211、AUTO212、IDENTITY3、SEQUENCE4OracleSequence5、TABLEid三 聯(lián)合主鍵.1、xml2、annotation第14課Hibernate開發(fā)接口(重點)一 Configuration(AnnotationConfiguration)二 SessionFactory三 Session1 管理一個數(shù)據(jù)庫的任務單元.2 save();3 delete()4 load()5 Get()6 load()與get()區(qū)別.7 update()8 saveOrUpdate()9 clear()10 flush()11 evict()15一 瞬時對象(TransientObject):.二 持久化對象(PersistentObject):.三 離線對象(DetachedObject):.四 三種狀態(tài)的區(qū)分:.五 總結(jié):.16一 一對一關聯(lián)映射. lism)37 唯一外鍵關聯(lián)-雙向.40(三 主鍵關聯(lián)-單向(不重要)(四 主鍵關聯(lián)-雙向(不重要)(五 聯(lián)合主鍵關聯(lián)(Annotation方式)二 component(組件)關聯(lián)映射.(一 Component關聯(lián)映射:.(二 User實體類:.(三 Contact值對象:. xml--User映射文件(組件映射):.46 annotateon注解.46(六 導出數(shù)據(jù)庫輸出SQL語句:.(七 數(shù)據(jù)表結(jié)構(gòu):.(八 組件映射數(shù)據(jù)保存:.三 多對一–單向.(一 對象模型圖:.(二 關系模型:.(三 關聯(lián)映射的本質(zhì):.(四 實體類.(五 xml方式:映射文件:.(六 annotation 多對一(先group(對象持久化狀態(tài)后,再保存user)):.50(八 重要屬性-cascade(級聯(lián)):.(九 多對 加載數(shù)據(jù).四 一對多-單向.(一 對象模型:.(二 關系模型:.(三 多對一、一對多的區(qū)別:.(四 實體類.(五 xml方式:映射.(六 annotateon注解. 導出至數(shù)據(jù)庫(hbmàddl)生成的SQL語句:.53 一對多單向?qū)嵗?53(九 生成的SQL語句:. 一對多,在一的一端關系的缺點:.54 一對多單向數(shù)據(jù)加載:.54(十二 加載生成SQL語句:.五 一對多-雙向.(一 xml方式:映射.(二 annotateon方式注解.(三 數(shù)據(jù)保存:.(四 關于inverse屬性:.(五 Inverse和cascade區(qū)別:.(六 一對多雙向關聯(lián)映射總結(jié):.六 多對多-單向.(一 實例場景:.(二 對象模型:.(三 關系模型:.(四 實體類.(五 xml方式:映射.(六 annotation注解方式.(七 生成SQL語句.(八)數(shù)據(jù)庫表及結(jié)構(gòu):.(九)多對多關聯(lián)映射單向數(shù)據(jù):.59(十)61七、多對多-雙向.61(一)xml(二)annotation八 關聯(lián)關系中的CRUD_Cascade_Fetch九、集合映射.十、繼承關聯(lián)映射.(一 繼承關聯(lián)映射的分類:.(二)對象模型:.(三 單表繼承SINGLE_TABLE:.(四 具體表繼承JOINED:.(五 類表繼承TABLE_PER_CLASS(六 三種繼承關聯(lián)映射的區(qū)別:.17hibernate一 節(jié)點實體類:.二 xml方式:映射文件:.三 annotation注解.四 測試代碼:.五 相應的類代碼:.18一 設計.二 代碼:.三 注意.19Hibernate(QueryLanguage)一 Hibernate可以使用的查詢語言.二 實例一.三 實體一測試代碼:.四 實例二. 實例二測試代碼.87第20課QuerybyCriteria(QBC)89 實體代碼:.89二 Restrictions用法.三 工具類Order提供設置排序方式.四 工具類Projections提供對查詢結(jié)果進行統(tǒng)計與分組操作.五 QBC分頁查詢.六 QBC復合查詢.七 QBC離線查詢.21QueryByExample(QBE)一 實例代碼.第22課Query.list與 te(不太重要)一 te查詢數(shù)據(jù).二 query.list()和 te()的區(qū)別.三 兩次query.list()2324hibernate一 Session級緩存(一級緩存)二 二級緩存.1 二級緩存的配置和使用:.2 二級緩存的開啟:.3 指定二級緩存產(chǎn)品提供商:.4 使用二級緩存.5 應用范圍.6 二級緩存的管理:.7 二級緩存的交互.8 總結(jié).三 查詢緩存.四 緩存算法.25 數(shù)據(jù)庫的級別:并發(fā)性作用。.104 Mysql查看數(shù)據(jù)庫級別:.1042 Mysql數(shù)據(jù)庫修改級別:.二 事務概念(ACID)三 事務并發(fā)時可能出現(xiàn)問題.26hibernate一 悲觀鎖.1 悲觀鎖的實現(xiàn).2 悲觀鎖的適用場景:.3 實例:.4 悲觀鎖的使用.5 執(zhí)行輸出SQL語句:.二 樂觀鎖.1內(nèi)1 Hibernate原理模擬-什么是O/RMap以及為什么要有O/RMap 常風的O/R框架4 Hibernate基礎配5 Hibernate接口介6 對象的三種狀7 ID生成策8 關系映9 Hibernate查詢10 在Struts基礎上繼續(xù)完美11 性能優(yōu)12 補充話2HibernateUML31 先脈絡,后細2 先操作、后原3 重Annotation,輕xml配置文JPAEJB3Hibernate–41 hibernate-distribution-3.3.2.GA-hibernate-annotations-slf4j- (hibernate2 文3 hibernateannotateon5準1 hibernate3.3.22 hibernate-annotations-3.4.0 注意閱讀hibernatecompatibilitymatrix slf4j1.5.86Hibernate1 建立新的java項目,名為hibernate_0100_2 學習建立User-liberary-hibernate,并加入相應的jar項目右鍵-buildpath-configurebuildpath-addUser-librarylibrary,命名為libraryhibernatejarSlf-3 引入mysql的JDBC驅(qū)動4 在mysql中建立對應的數(shù)據(jù)庫以及CreateCreatetableStudent(idintprimarykey,namevarchar(20),ageint);5 建立hibernate配置文件6 建立Student7 建立Student映射文件8 將映射文件加入到9 寫測試類Main,在Main中對Student對象進行直接的測[java]view1.public voidmain(String[] Configuration SessionFactory Sessionsession Student *org.hibernate.cfg.Configuration*hibernate配置文件(perties)的.*new Configuration()默認是*所以使用 來hibernate.cfg.xml配置文cfg= ***SessionFactorysf= trysessionweb//sessionconcation,session//sessionsession. hibernate JDBC hibernate} (HibernateException } }}1 newConfiguration().configure().buildSessionFactory(), org.hibernate.cfg.Configuration*hibernate配置文件(perties)*newConfiguration()默認是*newConfiguration().configure();來hibernate.cfg.xml注意:在hibernate里的操作都應該放在事務7Annotation本W(wǎng)orldhibernate3.0 創(chuàng)建teacher表,createtableteacher(idintprimarykey,namevarchar(20),titlevarchar(10));2 創(chuàng)建Teacher[java]view Teacher int String String//設置主鍵使用 int return void {this.id String return void{ String return void{this.title 1 在hibernatelibrary中加入annotation的jarHibernateannotationsEjb3persistencemonannotations注意文檔中沒有提 mon-2 參考Annotation文檔建立對應的注[java]view Teacher Teacher int String String//設置主鍵使用 int return void this.id String return void String return void title)this.title 1 在hibernate.cfg.xml中建立映射<ma<map注意:<map>中使用的是class屬性,而不是resource屬性,并且使2 參考文檔進[java]view void Teacher t.setTitle(" org.hibernate.cfg.AnnotationConfigurationConfiguration,Annotation Configurationcfg SessionFactorysf Sessionsession 1 后不給提解決方法:windows→Proferences→seach“ContentAssist”Auto-Activation———————————————————————————————————————————————————————————————————————————————————————————8O/R一 定義ORM(ObjectRelationalMap)---是一種為了解決面向?qū)ο笈c關系型數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術。簡單說:ORM一 Hibernate的創(chuàng)人Gavin二 Hibernate做么1 就是將對象模型(實體類)的東西存入關系模型中2 實體中類對應關系型庫中的一個表3 實體類中的一個屬性會對應關系型數(shù)據(jù)庫表中的一個4 實體類的一個實例會對應關系型數(shù)據(jù)庫表中的一條記錄%%將對象數(shù)據(jù)保存到數(shù)據(jù)庫、將數(shù)據(jù)庫數(shù)據(jù)讀入到對象OOP---面向?qū)ο蟮拈_就是阻抗不匹配。Hibernate三 Hibernate存在原因1 解決阻抗不匹配的問題2 目前不存在完整的面向?qū)ο蟮臄?shù)據(jù)庫(目前都是關系型數(shù)據(jù)庫3 JDBC操作數(shù)據(jù)庫很繁4 SQL語句編寫并不是面向?qū)? 可以在對象和關系表之間建立關聯(lián)來簡化編6 O/RMap簡化編7 O/RMap數(shù)據(jù)庫平8 hibernate_0200_OR_Map四 Hibernate的優(yōu)點 可以了,就可以能夠、更新、刪除、加載對象,可以提高生產(chǎn)效; 4、Hibernate承Hibernate中的任何類、實現(xiàn)任何接口,只是個純粹的單純對象—稱為POJO對象(最純粹的對象—這個對象沒有繼承第框架的任何類它的任何接5、Hibernate6 Hibernate代碼測試方便五 Hibernate使用圍Hibernate(O/SQL9Hibernate習Hibernate的對象關系映一、對象---關系映射模 二、常用O/R映射框架1 2 JDO(是SUN一套標準—Java數(shù)據(jù)對象 Toplink(Orocle公司的)5 EJB(2.0X中有CMP;3.0X提出了一套“Java持久化API”---6、IBatis(JDBC說不是O/R映射框架,而是基于SQL的映射(提供了一套配置文件,把SQL語句配置到文件中,再配置一個對象進去,只要配置文件時,就可得到對象))7 JAP(是SUN公司的一套標準10HibernateOR測試驅(qū)動開一項目名hibernate_0200_OR_Map二 原代[java]viewTest staticvoid args)throws Student Sessionsession SessionSession[java]viewSession Session tableName Map<String,String>cfs cfs.put("_id",cfs.put("_name",cfs.put("_age",methodNames void throwsString createSQL();//SQLConnectionconn PreparedStatementps for(int methodNames.length;Methodm=s.getClass().getMethod(methodNames[i]);//返回一個Method對象,它反映此Class對象所Classr=m.getReturnType();//返回一個Class對象,該對象描述了此Method對象所表示的方法的正式{參數(shù)都隨需服從方法調(diào)用轉(zhuǎn)換 returnValueps.setString(i }if(r.getName().equals("int")) returnValue + }{ returnValue ps.setString(i } +}} String String int for(String v.substring(1);// ="get" getter } - for(int str2 -String ++str1 return11Hibernate配 介紹MYSQL的圖形化客戶端3 4 搭建日志環(huán)境并配置顯示DDL語5 搭建Junit環(huán)Junit ehibernate.cfg.xml:show_sql7 8 表名和類名不同,對表名進行配Xml:9 字段名和屬性相默認為Xml10 字段名和屬性名不Xml:11 不需要psersistence的字Xml:12 映射日期與時間類型,指定時間精Xml:13 映射枚舉類Xml:14 字段映射的位置(field或者get方法Bestpractice:fieldget/set15 16 課外:CLOBBLOB類型的數(shù)據(jù)存17 課外:Hibernate自定義數(shù)據(jù)類18 Hibernate類MYSQL圖形化客戶SessionFactoryschemaDDLcreate-dropSessionFactorydropschema.取值validate|update|create|create-drop四、搭建日志環(huán)境并配置顯DDL語slflog4j1 首先引入log4j的jar包(log4j- Junit1Junit類庫jar(junit-2、在項目名上右鍵→new→SourceFolder→輸入名稱3、注意,你對哪個包進試,你就在測試下建立和那個包相同的[java]view 1.public TeacherTest{ staticSessionFactory =null; static sf= @Test// voidTeacher t.setTitle("Session @AfterClass//Junit static ehibernate.cfg.xmlSQLorg.hibernate.SQLlogcategorydebug。取值:true|falsehibernate.cfg.xmllogconsoleSQL取值true|falseTrue式:[java]view DEBUG table id nametitleprimary False樣式[java]view16:33:40,484DEBUGSchemaExport:377-createtableTeacher(idintegernotnull,namevarchar(255),titlevarchar(255),primarykey(id))八、表名和類名不同,對表名進行配Annotation:@Table(name=”tableName[java]view Teacher Id,getXXX Teacher}[java]view name="Student"段名和屬性相Annotation:默認為注意:如果在成員屬性沒有加入任何注解,則默認面加入了Xml段名和屬性名不Annotation:使用@Column(name=”columnName”)進行注[java]view Teacher Teacher{ int String Stringtitle;//設置主鍵使用 int return @Column(name="_name")// String return [java]view name="name"十一、不需要(持久化)psersistence的字Annotation:使用@Transient進行注解就可以了。[java]view String return4.Xml:十二、映射日期與時間類型,指定時間精TemporalTypeTemporalType.TIMESTAMP表示yyyy-MM-dd 表示yyyy-MM- 表示[java]view Date return4.注意:當使用注解時,屬性為value時,則這個屬性名可以省略,例如Xml:typehibernate[java]view name="birthDate"注意:hibernate:date,time,timestamp,當然您Java十二枚舉類其中EnumType有二個值:①EnumType.STRING RDINAL表示將枚舉所對應的數(shù)值存入數(shù)據(jù)Xml:12hibernate對象packagecom.wjt276.hibernate;importorg.hibernate.cfg.AnnotationConfiguration;importorg.hibernate.cfg.Configuration;importHibernatehbmAnnotationCopy@author@version1.0publicclasportDBpublicstaticvoidmain(String[]/*org.hibernate.cfg.Configuration*hibernate配置文件(perties)*newConfiguration()默認是*newConfiguration().configure();來hibernate.cfg.xmlConfigurationcfg=new/*org.hibernate.tool.hbm2ddl.SchemaExport*Configuration*SchemaExportexport=/***第一個參數(shù):scriptDDL*第二個參數(shù):exportexport.create(true,運行剛剛建立的ExportDB類中的main()方法,進行實際的導出類13ID策Xml被映射的類必須定義對應數(shù)據(jù)庫表主鍵字段。大多數(shù)類有一個JavaBeans風格<id> nametypeHibernatehibernatehbernate(integer,long,short,float,double,character,byte,boolean,yes_no,true_false)length(typevarcharcolumnnameunsaved-value(sensible)例和從以前的session中裝載過(可能又做過修改--譯者注)但未再次持久化access(可選-默認為property):Hibernate用來屬性值的策略。如果nameunsaved-valueHibernate3還有一個另外的<composite-id>定義可以舊式的多主鍵數(shù)據(jù)。我們強烈不<generator>元素(主鍵生成策用來為該持久化類的實例生成唯一的標識。如果這個實例需要某些配置值或者初始化參數(shù),用<param>元素來傳遞。<idname="id"type="long"<generator<param所有的都實現(xiàn)org.hibernate.id.IdentifierGenerator接口。這是一Hibernate提供了很多內(nèi)置的實現(xiàn)。下面是一些內(nèi)置的快捷名字:long,shortint張表中插入數(shù)據(jù)時才能使用。在集群下不要使用。對DB2,MySQL,MSSQLServer,Sybase和Hy 支持。返回的標識符是long,short或者int類型的。(數(shù)據(jù)庫自增)DB2,PostgreSQL,Oracle,SAPDB,McKoi(sequence),而在Interbase中使用(generator)。返回的標識符是long,short或者intlong,short或者int一個表和字段(默認分別是hibernate_unique_key和next_hi)作為值的來源。高/低位算法生成的標識符只在一個特定的數(shù)據(jù)庫中是唯一的。long,shortint用一個128-bit的UUID算法生成字符串類型的標識符,這在一個網(wǎng)絡中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進制數(shù)字的字符串,它hibernateUUID包含:IP地址,JVM的啟動時間(精確到1/4秒),系統(tǒng)時間和一個計數(shù)器值(在JVM中唯一)。Java代碼中不可能獲得MAC地址或者內(nèi)存地址,JNIMSSQLServer和MySQLGUID根據(jù)底層數(shù)據(jù)庫的能力選擇identity,sequence或者hilo中的一個。(數(shù)據(jù)庫save()<generator>元素沒有使用另外一個相關聯(lián)的對象的標識符。通常和<one-to-one>使用annotateonStrategy有四個值 、AUTOidentitycolumnsequencenative 、TABLEid 、IDENTITY-identity 、SEQUENCE-注意:auto是默認值,也就是說沒有后的參數(shù)則表示為1、AUTO默publicintgetId(){return}或publicintgetId(){return}1 對于mysql,使用2 對于oracle使用hibernate_sequence(名稱固定2、publicintgetId(){return}對DB2,MySQL,MSSQLServer,Sybase和Hy 支持。返回的標識符是long,short或者int類型的。(數(shù)據(jù)庫自增)注意:此生成策略不支持3、publicintgetId(){return}DB2,PostgreSQL,Oracle,SAPDB,McKoi(sequence),而在Interbase中使用(generator)。返回的標識符是long,short或者int注意:此生成策略不支持4Oracle指定定義的參數(shù)注意:SEQ_Name:SequenceSEQ_DB_Name:SequencepublicclassTeacher{})參數(shù):strategy:GenerationType.SEQUENCEpublicclassTeacher{privateintpublicintgetId()return5、TABLE用表保存idID,然后再給這個值累加一個值再次存入數(shù)據(jù)庫,以便下次取Table主鍵生成策略的定義 pkColumnName="pk_key", varchar,keyvalueColumnName="pk_value", 字段名int,value 的第一個字段的值(keyinitialValue= 策略中使用該記錄的第二個字段的值(value )createtableGENERATOR_TABLE(pk_keyvarchar(255),pk_valueinteger1。TABLE主鍵生成策略 pkColumnName="pk_key", varchar,keyvalueColumnName="pk_value", 字段名int,value 的第一個字段的值(keyinitialValue= 策略中使用該記錄的第二個字段的值(value )publicclassTeacherprivateintid;publicintgetId()return注意:TeacherGENERATOR_TABLEpk_value1,GENERATOR_TABLEtable、pkColumnName、valueColumnName合主1、xml方實例場景:核算期publicclassFiscalYearPeriodprivateintfiscalYear;//核算年privateintfiscalPeriod;privateDatebeginDate;privateDateendDate;//結(jié)束日期privateStringperiodSts;//狀態(tài)publicintgetFiscalYear(){return}publicvoidsetFiscalYear(intfiscalYear){this.fiscalYear=fiscalYear;}publicintgetFiscalPeriod(){ returnfiscalPeriod;}publicvoidsetFiscalPeriod(intfiscalPeriod){this.fiscalPeriod}publicDategetBeginDate(){returnpublicvoidsetBeginDate(DatebeginDate){ this.beginDate=beginDate;}publicDategetEndDate(){returnpublicvoidsetEndDate(DateendDate){ this.endDate=endDate;}publicStringgetPeriodSts() returnpublicvoidsetPeriodSts(StringperiodSts){this.periodSts=}復合主鍵的映射,一般情況把主鍵相關的屬性抽取出來單獨放入一個類中。而這個類是有要求的:必需實現(xiàn)序列化接口(java.io.Serializable)(可以保存到磁盤上),為了確定這個復合主鍵類所對應對象的唯一性就會產(chǎn)生比較,對象比較就需要復寫對象的hashCode()、equals()方法(復寫方法如下),然后在類中這個復合主鍵類復合主鍵類復合主鍵必需實現(xiàn)java.io.Serializable接publicclassFiscalYearPeriodPKimplementsjava.io.Serializable{privateintfiscalYear;//核算年privateintfiscalPeriod;//核算月publicintgetFiscalYear(){return}publicvoidsetFiscalYear(intfiscalYear)this.fiscalYear=}publicintgetFiscalPeriod(){returnfiscalPeriod;}publicvoidsetFiscalPeriod(intfiscalPeriod){this.fiscalPeriod=fiscalPeriod;}publicinthashCode()finalintprime=31;intresult=1;result=prime*result+fiscalPeriod;result=prime*result+fiscalYear;returnresult;}publicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnif(getClass()!=obj.getClass())returnfalse;FiscalYearPeriodPKother=(FiscalYearPeriodPK)obj;if(fiscalPeriod!=other.fiscalPeriod)returnif(fiscalYear!=other.fiscalYear)returnfalse;return實體類:(中了復合主鍵類)publicclassFiscalYearPeriod{privateFiscalYearPeriodPKfiscalYearPeriodPK;//復合主類privateDatebeginDate;//開始日期privateDateendDate;//結(jié)束日期privateStringperiodSts;//狀態(tài)publicFiscalYearPeriodPKgetFiscalYearPeriodPK(){returnfiscalYearPeriodPK;}publicvoidsetFiscalYearPeriodPK(FiscalYearPeriodPKfiscalYearPeriodPK)this.fiscalYearPeriodPK=}FiscalYearPeriod.hbm.xml映射文<hibernate-map<composite-id<key-property<key-property</composite-<property<property<property</hibernate-map導出數(shù)據(jù)庫輸出SQL語句createtablet_fiscalYearPeriod(fiscalYearintegernotnull,fiscalPeriodintegernotnull,beginDatedatetime,endDatedatetime,periodStsvarchar(255),primarykey(fiscalYear,fiscalPeriod))//實體數(shù)據(jù)庫表結(jié)構(gòu)復合主鍵關聯(lián)映射數(shù)據(jù)tx=session.beginTransaction();FiscalYearPeriodfiscalYearPeriod=newFiscalYearPeriodPKpk=newFiscalYearPeriodPK();fiscalYearPeriod.setFiscalYearPeriodPK(pk);//鍵fiscalYearPeriod.setEndDate(newDate());fiscalYearPeriod.setBeginDate(newDate());執(zhí)行輸出SQL語句Hibernate:insertintot_fiscalYearPeriod(beginDate,endDate,periodSts,fiscalYear,fiscalPeriod)values(?,?,?,?,?)數(shù)據(jù)的加載2、annotation方下面是定義組合主鍵的幾種語將類注解為@IdClass,并將該實體中所有屬于主鍵的屬性都注解為publicclassTeacherPKimplementsjava.io.Serializable{privateintid;privateStringpublicintgetId(){return publicvoidsetId(intid){this.id=id;}publicStringgetName(){ returnname;}publicvoidsetName(Stringname){ =name;}publicbooleanequals(Objecto){ publicinthashCode(){return }將組件類的屬性注解為@Id,實體類中組件的publicclassTeacher{privateTeacherPKpk;privateStringpublicTeacherPKgetPk(){returnpk;將組件的屬性注解為publicclassTeacher{privateTeacherPKpk;privateStringpublicTeacherPKgetPk(){returnpk;類注解為@IdClass,主鍵的屬性都注解為@Id需要將復合主鍵類建立好,不需要進行任何注解在實體類中不需要進行復合主鍵類的classpublicclassTeacher{//privateTeacherPKpk;//不再需要privateintid;privateStringname;publicintgetId(){return publicvoidsetId(intid){this.id= publicStringgetName(){returnpublicvoidsetName(Stringname){=第14課Hibernate開發(fā)接口(作用:進行配置信息的管目標:用來產(chǎn)生configurehibernate加載默認的hibernate配置文件sessionFactory=加載指定hibernate的配置文只需要關注一個方法作用:主要用于產(chǎn)生Session的工廠(數(shù)據(jù)庫連接池當它產(chǎn)生一個Session時,會從數(shù)據(jù)庫連接池取出接,交給這Sessionsession= Session兩方法的區(qū)別①、openSession是每次都打開一個新的Session②、OpenSessionclose,③、getCurrentSession上下文<property常用的是:①、thread:是從上下文找、只有當前沒SessionSession,②、jta:ApplicationServer(Tomcat③、managed:④、custom.Class:1 管理一個數(shù)據(jù)庫的任務單2 3 ObjectTransistent4 格式Session.load(Classarg0,Serializablearg1)throws*arg0:需要加載對象的類,例如*arg1: hibernate1此方法返回類型為Object,但返回的是對象SQLloadlazy(SQL*hibernate延遲加載實現(xiàn)原理是方式trysession=sf.openSession();UseruserSQLSystem.out.println("="+userpersistent。user.setName("}catch(HibernateExceptione){}if(session!=}}}5 格式:Session.get(Classarg0,Serializablearg1)方*arg0:需要加載對象的類,例如*arg1: 是基數(shù)類型,則hibernate會自動轉(zhuǎn)換成包裝類,如1Object,也就是對象,然后我們再強行轉(zhuǎn)trysession=sf.openSession();SQLUserUseruser=(User)session.get(User.class,persistentSystem.out.println("="+步
userpersistentuser.setName("}catch(HibernateExceptione){}if(session!=}}6 load()與get()區(qū)②、load返回的是對象,等到真正使用對象的內(nèi)容時才發(fā)出sql語句,sessionopen③、getget()和load()只根據(jù)主鍵查詢,不能根據(jù)其它字段查詢,如果想根據(jù)非主鍵查詢,可以使用HQL7 detachedpersistent transient persistentsession 1:update/updatablexml:設定<property>的update屬性,設置在更新時是否參數(shù)更<propertyname="name"注意:updatetrue(默認):參與更新;false:publicStringgetTitle(){return方法二:dynamic-update注意:此方法目前只適合xml方式,JAP1.0annotation沒有對應在實體類的映射文件中的<class>中,使用dynamic-update屬性,true:session(session),session<classname="com.bjsxt.Student"dynamic-代碼publicvoidtestUpdate5()Students=(Student)session.get(Student.class,1);namespersistentspersistent態(tài)session2.getTransaction().commit();}session.merget()方法,合并字段內(nèi)容publicvoidtestUpdate6()Students=(Student)session.get(Student.class,1); publicvoidtestUpdate7()Queryq"updateS='z5'wheres.id=1");}8 update,save9 session如果沒有,才會去數(shù)據(jù)庫查找,clear()方法可以強制清除session存Teachert=(Teacher)session.load(Teacher.class,1);Teachert2=(Teacher)session.load(Teacher.class,1);注意:這樣就會發(fā)出兩條SELECT語句,如果把session.clear()去除,則只會發(fā)出一條SELECT語句,因為第二次load時,是使用session緩存中ID1load10在hibernate中也存在flush這個功能,在默認的情況下 前時,其實執(zhí)行了一個flush命令。Session.flush功能 insert、deleteSQLSession在什么情況下執(zhí)行 注意:flush時,可以自己設定,使用session.setFlushMode(FlushMode)來指FlushMode的枚舉值 FlushMode.ALWAYS:SQLflush flush( MIT:只有在commit時才flush FlushMode.MANUAL:手動flush。 FlushMode.NEVER:不flush 比如session取數(shù)據(jù)為只讀時用,這樣就注意:設置flush模式時,需要在session開啟事務之前置 在執(zhí)行查詢前,如 注:如果主鍵生成策略是uuid等不是由數(shù)據(jù)庫生成的,則session.save()時并不會發(fā)出SQL語句,只有flush時才會發(fā)出SQL語句,但如果主鍵生成策略nativesession.saveSQL11例如但是commit時使用,會拋出異常session=HibernateUtils.getSession();tx=session.beginTransaction();User1user=newUser1(); user.setCreateTime(newDate());user.setExpireTime(newuuid,saveusersessioninsertid,sessionexistsInDatabasesession.evict(user);//session(EntityEntrieshibernatesession(insertions)userinsertentityEntriesexistsInDatabasetrue,evictusersession解決在逐出session緩存中的對象不拋出異常的方法//flushhibernateuserexistsInDatabasefalsesession.evict(user);//session(EntityEntriesuserinsertsessionexistsInDatabase15狀時對象(Transientnew是說它們沒有任何跟數(shù)據(jù)庫表相關聯(lián)的行為,只要應用不再這些對象(不再被任何其它對象所),它們的狀態(tài)將會丟失,并由回收機制回收久化對象(Persistent持久實例是任何具有數(shù)據(jù)庫標識的實例,它有持久化管理器Session統(tǒng)一管理,持久實例是在事務中進行操作 它們的狀態(tài)在事務結(jié)束時同數(shù)據(jù)庫線對象(Detachedhibernate種狀態(tài)的區(qū)分1 有沒有ID,(如果沒有則是Transient狀態(tài)2 ID在數(shù)據(jù)庫中有沒3 在內(nèi)存里有沒有(session緩存結(jié)Transient對象:隨時可能被回收器回收(在數(shù)據(jù)庫中沒有于之對應的記session內(nèi)存中一個象,沒有ID,緩存中也沒內(nèi)存中有、存中有、數(shù)據(jù)庫有Detached對象:也可能被回收器回收掉(數(shù)據(jù)庫中存在對應的記錄,只是沒有任何對象它是指session),注引狀態(tài)經(jīng)過Persistent狀態(tài),沒session內(nèi)存有、緩存沒有、數(shù)據(jù)庫有16 存在以下關系1 一對 3 多對 4 多對 5 集合映 7 組件映 對一關聯(lián)映 兩個對象之間是一對一的關系,如-IdCard(人— 間的一一對應的關系;數(shù)據(jù)庫表不會有額外的字段來它們之間的關系,僅 實體類/**人-實體類*/publicclass{privateintid;privateStringname;publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=}publicclassIdCardprivateintid;privateStringcardNo;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returnpublicvoidsetCardNo(StringcardNo){this.cardNo=}(一)唯一外鍵關聯(lián)-單向 1明人—->號(àIdCard),從IdCard看不到對2象模需要在類中持有IdCard的一個idCard,則IdCard中沒有3系模idcard4體類注:IdCard是被對象,沒有變化/**人-實體類publicclassprivateintid;privateStringname;privateIdCardidCard;//IdCard對publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicIdCardgetIdCard(){returnidCard;}publicvoidsetIdCard(IdCardidCard){this.idCard=}5xmlIdCard實體類的映射文件因為IdCard是被的,所以沒有什么特殊的映<hibernate-map<classname="com.wjt276.hibernate.IdCard"<idname="id"<generator<property</hibernate-map實體類的映射文件在映射時需要添加一個外鍵的映射,就是指定IdCard的引<hibernate-map<classname="com.wjt276.hibernate." <idname="id"<generator<property<!--<many-to-one>:在多的一端(當前一端),加入一個外鍵(當前為idCard)IdCard),unique="true",這樣就可以此字段唯一了。--><many-to-onename="idCard"</hibernate-map注意:這里的<many-to-one>中的name屬性值并不是數(shù)據(jù)庫中的字段名,而是實體類中IdCard對象成員屬性的getxxx方法后面的xxx(此處是getIdCard,所以是idCard),要求第一個字段小寫。如果不指定columnname6annotateon解映注意IdCard是被對象,除正常注解,無需要其它注/**publicclassIdCard{privateintid;privateStringcardNo;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returncardNo;}publicvoidsetCardNo(StringcardNo){this.cardNo=} 對象的實體類需要使用@OneToOne進行注解,來表面是一對一的關如果省略@JoinColumnhibernate是:被對象名稱_被對象的主鍵ID)/***/publicclass{privateintid;privateIdCardidCard;//IdCard對privateStringname;publicintgetIdreturnid;}publicIdCardgetIdCard(){returnidCard;}publicStringgetName(){returnname;}publicvoidsetId(intid){this.id=id;}publicvoidsetIdCard(IdCardidCard){this.idCard=idCard;}publicvoidsetName(Stringname){=name;}}7成的SQL句createtableIdCardidintegernotnullauto_increment,cardNovarchar(255),primary)createtableidintegernotnullauto_increment,primarykey(id))alteraddindexFK8E488775BE010483(idCard),addconstraintFK8E488775BE010483foreignkey(idCard)//外鍵referencesIdCard(id)//IdCard的id字8、測Sessionsession=IdCardidCard=newIdCard(); idCard,TransientidCard=new();.setName(" 一外鍵關聯(lián)-雙1明人<—->號(<->IdCard)雙向:互相持有對方的2、對象模型:3系模型4體類實體類,只是相互持有對象的,并且要求getter和setter方5xml實體類映射文件:同單向的沒有變化IdCard體類映射文件:如果使用同樣的方法映射,這樣就會在表中也添加一hibernateIDID了。也同樣需要使用<one-to-one>來映射,但是需要使用property-ref屬性來指定對象持有你自己的的成員屬性名稱(是gettxxxx后面的名稱),這hibernate<classname="com.wjt276.hibernate.IdCard"<idname="id"<generator<property<!--<one-to-one>:告訴hibernate如何加載其關聯(lián)對property-ref<one-to-onename=""property-一對一唯一外鍵關聯(lián)映射雙向需要在另一端(當前IdCard),添加<one-to-one>,指示hibernate如何加載其關聯(lián)對象(或?qū)ο?,默認根據(jù)主鍵 <!--<one-to- hibernateproperty-ref6、annotateon解映射注解映射同單向一樣IdCard解映射如下:使用@OneToOnepublicclassIdCard{privateintid;privateStringcardNo;private//mappedBy:在指定當前對象在被對象的idCard做了映射//此值:當前對象持有對象中當前對象的成員屬性名稱(getXXX后//因為對象的持有IdCard對象的方法是getIdCard()因為需要idCardpublicget publicvoidset(){this. publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetCardNo(){returncardNo;}publicvoidsetCardNo(StringcardNo){this.cardNo=}7SQL要相互加載對方,這由hibernate來完成。因為生成的sql語句同單向一樣8、測試9結(jié)鍵關聯(lián)-單向(不重系;數(shù)據(jù)庫表不會有額外的字段來它們之間的關系,僅通過表的主鍵來關1明人—->號(àIdCard),從IdCard看不到對2象模3系模因為是idcard,所以idcard要求先有值。而的主鍵值不idcard4體類實體類同一對一唯一外鍵關聯(lián)的實體類一個, 對象中持有對象的(代碼見唯一外鍵關系)5、xml射IdCard映射文件,先生成<classname="com.wjt276.hibernate.IdCard"<id<generator<property實體類映射文件,ID是根據(jù)IdCard主鍵值<classname="com.wjt276.hibernate. <idforeign使用。再使用元素<param>的屬性值指定相關聯(lián)對象(這里相關聯(lián)的對idCard,idCardid)為了能夠在加載數(shù)據(jù)同時加載IdCard數(shù)據(jù),所以需要使用一個<one-to-one>來設置這個功能。--><generator<!--元素<param>nameproperty--<param<property<!--<one-to-表示如何加載它的對象(這里對象就指idCard這里nameidCard),同時也說是一對一的關系。默認方式是根據(jù)主鍵加載(把中的主鍵取出再到IdCard中來取相關IdCard數(shù)據(jù)。)我們也此鍵也作為一個外鍵了IdCard,所以需要加一個數(shù)據(jù)庫限制(外鍵約 6、annotateon解映射實體類注解publicclassprivateintprivateIdCardidCard;//IdCard對privateStringname;publicintgetId()returnid;}publicIdCardgetIdCard(){returnidCard;}publicStringgetName(){returnname;}publicvoidsetId(intid){this.id=id;}publicvoidsetIdCard(IdCardidCard){this.idCard=idCard;}publicvoidsetName(Stringname){=name;}}IdCard實體類,不需要持有對象的,正常注解就可以了7SQLcreatetableIdCardidintegernotnullauto_increment,primarykey)createtableidintegernotnull,primarykey(id))alteraddindexFK785BED805248EF3(id),addconstraintFK785BED805248EF3foreignkey(id)referencesidcard8、測session=HibernateUtils.getSession();tx=session.beginTransaction();IdCardidCard=newIdCard(); =new();.setName("TransientObjectExceptioncascade 9ID<id idcard,idCard<generator<param<property<!—one-to-one的含義:指示hibernate怎么加載它的關聯(lián)對象,默認根 外鍵參照了idCard--><one-to-onename="idCard"鍵關聯(lián)-雙向(不重系;數(shù)據(jù)庫表不會有額外的字段來它們之間的關系,僅通過表的主鍵來關主鍵關聯(lián)映射,實際是數(shù)據(jù)庫的結(jié)構(gòu)并沒有變化,只是要求雙方都可以持有對象,也就是說實體模型變化,實體類都相互持有對方。1xml實體類映射文件不變,IdCard如下<classname="com.wjt276.hibernate.IdCard"<idname="id"<generatorclass="native"/><property <one-to-onename="2annotateon解映射的注解不變,同主鍵單向注解IdCard注解,只需要在持有對象的getXXX前加@OneToOne(mappedBy="idCard")publicclassIdCardprivateintid;privateStringcardNo;privatepublicget(){ (五)聯(lián)合主鍵關聯(lián)(Annotation方式{})publicWifegetWife()return}@JoinColumnreferencedColumnName二、component(組件)關聯(lián)映Component聯(lián)映射 以上關系的映射稱為component(組件)關聯(lián)映 ponent可以成為是值對象(DDD)。User體類publicclassUser{privateintid;privateStringprivateContactcontact;//值對象的publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName() returnpublicvoidsetName(Stringname){ =name;}publicContactgetContact(){ returncontact;}publicvoidsetContact(Contactcontact){ this.contact=}Contact對象publicclassContact{privateString;privateStringaddress;privateStringzipCode;privateStringcontact;publicStringget returnpublicvoidset(String){ this.=;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}publicStringgetZipCode(){returnzipCode;}publicvoidsetZipCode(StringzipCode){this.zipCode=zipCode;}publicStringgetContact(){returncontact;}publicvoidsetContact(Stringcontact){this.contact=}(四)xml--User映射文件(組件映<hibernate-map<classname="com.wjt276.hibernate.User"<idname="id"<generator<propertyname="name"<!--<component>用于映射Component(組件)關系--<component<propertyname="<property<property<propertyname="contact</hibernate-mapannotateon使用@EmbeddedpublicclassUserprivateintid;privateStringname;privateContactcontact;//值對象的publicintgetId() returnpublicContactgetContact(){returncontact;}publicvoidsetContact(Contactcontact){this.contact=Contact類是值對象,不是實體對象,是屬于實體類的某一部分,因此沒有映出數(shù)據(jù)庫輸出SQL句createtableUseridintegernotnullauto_increment,addressvarchar(255),contactvarchar(255),varchar(255),zipCodevarchar(255),namevarchar(255),primarykey(id))據(jù)表結(jié)構(gòu)注:雖然實體類沒有基本聯(lián)系信息,只是有一個,但在映射數(shù)據(jù)庫時全部件映射數(shù)據(jù)保存tx=session.beginTransaction();Useruser=newUser();Contactcontact=newContact(); 實體類中值對象時,不用先保存值對象,因為它不是實體類,它只是一個session.save()中保存的對象是實體類。三 多對一–單場景:hibernate對應于一個組,所以用戶實體中應該有一個持有組的。象模型圖系模型聯(lián)映射的本質(zhì)多個。體User實體類publicclassUser{privateintid;privateStringname;privateGrouppublicGroupgetGroup(){return publicvoidsetGroup(Groupgroup){this.group=group;}publicintgetId(){returnid; publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname) =Group實體類publicclassGroup{privateintid;privateStringname;publicintgetId(){returnpublicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=}實體類建立完后,開始創(chuàng)建映射文件,先建立簡單的映射文件xml式:映射文件1Group體類的映射文件<hibernate-map<classname="com.wjt276.hibernate.Group"<idname="id"<generator<property</hibernate-map2User體類的映射文件<hibernate-map<classname="com.wjt276.hibernate.User"<idname="id"<generator<property<!--<many-to-one>name:是的屬性(User.group),這樣表示在多的一端表里加入一個字段名group,這樣這個字段(groupid)group(t_group一端),也就是就在多的一端加入一個外鍵指向一的一端。--><many-to-onename="group"</hibernate-map3、※<many-to-one>例如:<many-to-onename="group"<many-to-one>聯(lián)映射對一的關name:是的屬性(User.group),這樣表示在多的一端表里加入一個字段名稱group,groupSQL(column="groupid").這樣這個字段(groupid)group表(t_groupaltertablet_userdropforeignkeyFKCB63CCB695B3B5ACdroptableifexistst_groupdroptableifexistscreatetablet_group(idintegernotnul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防治老鼠服務合同協(xié)議書
- 建筑樁基工程施工合同
- 電熱水器維修合同
- 法律行業(yè)智能訴訟輔助工具研發(fā)方案
- 地暖承包合同
- 教育行業(yè)管理與教學實踐指南
- 農(nóng)業(yè)環(huán)境保護與管理指導書
- DeepSeek簡單版使用指南
- 店面承包合作協(xié)議合同
- 集裝箱活動房租賃合同樣本
- XX學校服采購工作方案(含一封信、備案表、反饋表)
- GB/T 33107-2016工業(yè)用碳酸二甲酯
- GB/T 18938-2008家用和類似用途的面包片電烘烤器性能測試方法
- 簡約卡通小學生校園文明禮儀教育PPT模板
- 勞動合同法經(jīng)典講義
- 三位數(shù)乘一位數(shù)練習題(精選100道)
- 教學第二章-毫針刺法1課件
- 產(chǎn)業(yè)園區(qū)環(huán)保管家實踐和案例
- 醫(yī)學約束帶的使用課件
- 傳染病防控工作職能部門間協(xié)調(diào)機制及流程
- 社會團體法定代表人登記表
評論
0/150
提交評論