版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Hibernate基礎(chǔ)Web應(yīng)用開(kāi)發(fā)技術(shù)(JavaEE)學(xué)習(xí)目標(biāo)首要目標(biāo)學(xué)習(xí)并掌握Hibernate的體系結(jié)構(gòu);理解掌握Hibernate的配置文件;掌握Hibernate中的持久化類(lèi);掌握Hibernate關(guān)系映射;在MyEclipse中熟練使用Hibernate次要目標(biāo)理解ORM基本概念本章提綱5.1ORM基本概念5.2Hibernate的體系結(jié)構(gòu)5.3HibernateAPI簡(jiǎn)介5.4Hibernate的配置文件5.5Hibernate中的持久化類(lèi)5.6Hibernate的對(duì)象—關(guān)系映射文件5.7Hibernate關(guān)系映射5.8通過(guò)HibernateAPI操縱數(shù)據(jù)庫(kù)5.9在MyEclipse中使用Hibernate5.1ORM基本概念ORM(ObjectRelationalMapping)對(duì)象關(guān)系映射用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類(lèi)型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換,主要功能是完成對(duì)象持久化并封裝數(shù)據(jù)訪問(wèn)的細(xì)節(jié)。目前應(yīng)用系統(tǒng)開(kāi)發(fā)中大多采用了MVC體系結(jié)構(gòu),將系統(tǒng)的邏輯實(shí)現(xiàn)與顯示界面分離。為了提高系統(tǒng)開(kāi)發(fā)效率,降低開(kāi)發(fā)成本和難度,更多的系統(tǒng)開(kāi)發(fā)人員將業(yè)務(wù)邏輯層分離出一個(gè)單獨(dú)的持久層,進(jìn)行數(shù)據(jù)的持久化操作,圖5-2MVC結(jié)構(gòu)模型
圖5-3持久化結(jié)構(gòu)模型5.1.1ORM框架簡(jiǎn)介APACHEOJBHibernateMyBATISEclipseLinkLINQToSQL(C#)EJBJPA5.1.2ORM中的映射關(guān)系對(duì)象關(guān)系映射(ORM)的目的就是在對(duì)象和關(guān)系模型之間建立一個(gè)中間橋梁,完成對(duì)象和關(guān)系模型的透明映射和無(wú)縫交互,提供基于關(guān)系型數(shù)據(jù)庫(kù)的面向?qū)ο蟛僮鳌RM將對(duì)象模型中的類(lèi)和關(guān)系數(shù)據(jù)庫(kù)中的表映射起來(lái),開(kāi)發(fā)人員可以直接使用對(duì)象來(lái)操作數(shù)據(jù)庫(kù),實(shí)現(xiàn)透明的數(shù)據(jù)持久化操作圖5-4ORM映射關(guān)系5.1.2ORM中的映射關(guān)系一個(gè)完整的對(duì)象關(guān)系映射框架,應(yīng)該具備以下四個(gè)方面:一個(gè)元數(shù)據(jù)映射規(guī)范。負(fù)責(zé)持久化類(lèi)、類(lèi)屬性和數(shù)據(jù)庫(kù)表、字段的映射,實(shí)現(xiàn)對(duì)象和關(guān)系的語(yǔ)義連接。一組對(duì)象操作接口。用于完成數(shù)據(jù)的增加、刪除、修改和更新等操作。一種面向?qū)ο蟮牟樵冋Z(yǔ)言。該語(yǔ)言能理解繼承、多態(tài)和關(guān)聯(lián)等面向?qū)ο筇匦?,?shí)現(xiàn)基于對(duì)象的查詢,并在對(duì)象之間導(dǎo)航。一系列與數(shù)據(jù)庫(kù)相關(guān)的技術(shù)實(shí)現(xiàn)。保證系統(tǒng)的完整性并提高系統(tǒng)的可用性和可擴(kuò)展性。5.2Hibernate的體系結(jié)構(gòu)Hibernate獨(dú)立于特定的關(guān)系數(shù)據(jù)庫(kù),使用映射文件實(shí)現(xiàn)持久化類(lèi)和數(shù)據(jù)庫(kù)表的映射關(guān)系。在映射文件中,將持久化對(duì)象的屬性與關(guān)系數(shù)據(jù)庫(kù)表的字段對(duì)應(yīng)起來(lái),通過(guò)對(duì)象的操作完成數(shù)據(jù)庫(kù)表的增加、刪除、查詢、修改操作。Hibernate主要包括三個(gè)組件:連接管理組件事務(wù)管理組件對(duì)象/關(guān)系映射組件5.2Hibernate的體系結(jié)構(gòu)圖5-2Hibernate體系結(jié)構(gòu)5.2Hibernate的體系結(jié)構(gòu)SessionFactorySessionFactory中保存了對(duì)應(yīng)當(dāng)前數(shù)據(jù)庫(kù)配置的所有映射關(guān)系,它是將某個(gè)數(shù)據(jù)庫(kù)的所有映射關(guān)系經(jīng)過(guò)編譯后保存在內(nèi)存中。SessionSession是Hibernate進(jìn)行持久化操作的基礎(chǔ),所有持久化操作都是在Session的基礎(chǔ)上完成的,相當(dāng)于JDBC中的Connection對(duì)象,它包含了與數(shù)據(jù)庫(kù)建立的連接對(duì)象。同時(shí)也是Transaction的工廠。5.2Hibernate的體系結(jié)構(gòu)Transaction(事務(wù))Transaction是一個(gè)單線程、短生命周期的對(duì)象,應(yīng)用程序用Transaction來(lái)表示一批任務(wù)的原子操作。ConnectionProviderConnectionProvider用于生成與數(shù)據(jù)庫(kù)建立連接的JDBC對(duì)象,同時(shí),它還將作為數(shù)據(jù)庫(kù)連接的緩沖池。TransactionFactoryTransactionFactory是生成Transaction對(duì)象的工廠,通過(guò)TransactionFactory實(shí)現(xiàn)了對(duì)事務(wù)的封裝,使其具體的實(shí)現(xiàn)方法與應(yīng)用程序無(wú)關(guān)。5.3HibernateAPI簡(jiǎn)介圖5-6Hibernate核心接口類(lèi)框圖Configuration接口Configuration是Hibernate的入口,其作用是讀取配置文件并創(chuàng)建SessionFactory對(duì)象。為了能創(chuàng)建一個(gè)SessionFactory對(duì)象,必須在Hibernate初始化時(shí)創(chuàng)建一個(gè)Configuration類(lèi)的實(shí)例。也就是說(shuō)Configuration對(duì)象只存在于系統(tǒng)的初始化階段,之后所有的持久化操作都通過(guò)創(chuàng)建的SessionFactory對(duì)象進(jìn)行。Configurationconfig=newConfiguration().configure();SessionFactory接口SessionFactory的主要作用是生成Session對(duì)象,如果應(yīng)用程序只有一個(gè)數(shù)據(jù)存儲(chǔ)源,則只需創(chuàng)建一個(gè)SessionFactory實(shí)例,創(chuàng)建好的SessionFactory實(shí)例是不能被改變的。Configurationconfig=newConfiguration().configure();SessionFactorysessionfactory=config.buildSessionFactory();Session接口Session的主要功能是讀取、創(chuàng)建和刪除映射的實(shí)體對(duì)象實(shí)例,這些操作將被轉(zhuǎn)化為對(duì)數(shù)據(jù)表中數(shù)據(jù)的增加、修改、查詢和刪除操作。Session實(shí)例通過(guò)SessionFactory對(duì)象創(chuàng)建而來(lái),創(chuàng)建方法如下。Configurationconfig=newConfiguration().configure();SessionFactorysessionfactory=config.buildSessionFactory();Sessionsession=sessionfactory.openSession();Transaction接口Transaction接口是對(duì)事務(wù)實(shí)現(xiàn)的一個(gè)抽象,用戶可以通過(guò)Transaction對(duì)象定義多個(gè)對(duì)數(shù)據(jù)庫(kù)的操作,通過(guò)Session對(duì)象的beginTransaction()方法可以得到一個(gè)Transaction對(duì)象實(shí)例Sessionsession=sessionfactory.openSession();Transactionta;try{//開(kāi)始一個(gè)事務(wù)ta=session.beginTransaction();//執(zhí)行事務(wù)...//提交事務(wù)mit();}catch(Exceptione){//出現(xiàn)異常,撤銷(xiāo)事務(wù)if(ta!=null){ta.rollback();}throwe;}finally{//關(guān)閉Sessionsession.close();}Query接口Query接口能方便的對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢操作,通過(guò)Session對(duì)象的createQuery()方法創(chuàng)建Query對(duì)象實(shí)例,通過(guò)Query對(duì)象設(shè)置查詢語(yǔ)句的參數(shù),執(zhí)行查詢語(yǔ)句并返回查詢結(jié)果。Queryquery=session.createQuery("fromCustomercwhere=:name");query.setParameter("name","tom");Criteria接口Criteria接口可以看作是傳統(tǒng)SQL的對(duì)象化表示,它本身只是一個(gè)查詢?nèi)萜鳎唧w的查詢條件需要通過(guò)Criteria.add()方法添加到Criteria實(shí)例中。Criteria接口采用了QBC檢索方式,它將數(shù)據(jù)的查詢條件封裝成為一個(gè)對(duì)象。Criteria接口實(shí)例通過(guò)調(diào)用Session對(duì)象的createCriteria()方法創(chuàng)建,通過(guò)Restrictions類(lèi)或者Expression類(lèi)來(lái)創(chuàng)建查詢條件對(duì)象,最后調(diào)用Criteria對(duì)象的list()方法執(zhí)行查詢語(yǔ)句。Criteriacriteria=session.createCriteria(TestCase.class).add(Restrictions.like("name","fiz%")).addOrder(Order.asc("age"));criteria.setMaxResults(50);Listtest=criteria.list();select*fromTestCasewherenamelike'fiz%'orderbyageasc5.4Hibernate的配置文件Hibernate配置文件主要用于配置Hibernate連接數(shù)據(jù)庫(kù)的參數(shù)以及其他一些Hibernate在運(yùn)行時(shí)需要使用到的各種參數(shù)值。它告知Hibernate如何連接數(shù)據(jù)庫(kù)、如何將持久化類(lèi)和數(shù)據(jù)表通過(guò)映射文件對(duì)應(yīng)起來(lái)。Hibernate配置文件可以采用以下兩種方式實(shí)現(xiàn):Java屬性文件:配置屬性采用“鍵值對(duì)(key-value)”的方式XML文件:Hibernate所使用的XML配置文件默認(rèn)名稱(chēng)為hibernate.cfg.xml。5.4Hibernate的配置文件<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property><propertyname="connection.url">jdbc:mysql://localhost:3306/webases</property><propertyname="connection.username">root</property><propertyname="connection.password">274507</property><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property><propertyname="show_sql">true</property><mappingresource="com/Hibernate/test_products.hbm.xml"/></session-factory></hibernate-configuration>5.4Hibernate的配置文件Hibernate具有許多可選配置參數(shù),這些參數(shù)必須包含在<session-factory>中。以上配置文件中各個(gè)屬性參數(shù)的含義如表5-1所示。參
數(shù)描
述connection.driver_class數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)程序connection.url數(shù)據(jù)庫(kù)連接URLconnection.username訪問(wèn)數(shù)據(jù)庫(kù)的用戶名connection.password訪問(wèn)數(shù)據(jù)庫(kù)的密碼dialect數(shù)據(jù)庫(kù)方言show_sql系統(tǒng)運(yùn)行時(shí),輸出SQL語(yǔ)句到控制臺(tái)5.4Hibernate的配置文件值得注意的是,除了表5-1所列的常用配置參數(shù)之外,配置文件中還有一個(gè)非常重要的參數(shù)<mapping/>。其中resource指定了Hibernate中持久化類(lèi)映射文件的位置。系統(tǒng)啟動(dòng)時(shí),Hibernate根據(jù)resource屬性自動(dòng)查找映射文件,并初始化持久化類(lèi)和數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系。另外,Dialect參數(shù)是和所使用的數(shù)據(jù)庫(kù)種類(lèi)相關(guān)。5.5Hibernate中的持久化類(lèi)在Hibernate項(xiàng)目中實(shí)現(xiàn)數(shù)據(jù)庫(kù)的面向?qū)ο蟛僮?,需要?jiǎng)?chuàng)建一個(gè)持久化類(lèi),通過(guò)映射文件將持久化對(duì)象與數(shù)據(jù)表建立關(guān)聯(lián),并在配置文件中通過(guò)<mapping>參數(shù)告知Hibernate映射文件的位置。5.5.1對(duì)象狀態(tài)瞬時(shí)態(tài)
所謂瞬時(shí)態(tài),指對(duì)象通過(guò)new操作創(chuàng)建,與數(shù)據(jù)庫(kù)中的數(shù)據(jù)沒(méi)有任何關(guān)聯(lián)。瞬時(shí)態(tài)對(duì)象不會(huì)被持久化到數(shù)據(jù)庫(kù)中,也不會(huì)被賦予持久化標(biāo)識(shí)符。通過(guò)持久化類(lèi)Customer創(chuàng)建的對(duì)象testPerson此時(shí)并沒(méi)有通過(guò)Session對(duì)象的實(shí)例對(duì)它進(jìn)行任何持久化操作,也就是說(shuō)testPerson對(duì)象此時(shí)與數(shù)據(jù)庫(kù)中的記錄沒(méi)有任何關(guān)系,它處于瞬時(shí)態(tài)。CustomertestPerson=newCustomer();testPerson.setFirstname("Jerry");testPerson.setLanguage("Chinese");5.5.1對(duì)象狀態(tài)持久態(tài)
所謂持久態(tài),是指該對(duì)象處于Hibernate框架所管理的狀態(tài)。它與Session對(duì)象的實(shí)例相關(guān),對(duì)其所做的任何變更操作都會(huì)被Hibernate持久化到數(shù)據(jù)庫(kù)中。當(dāng)一個(gè)實(shí)體對(duì)象通過(guò)Session與數(shù)據(jù)庫(kù)發(fā)生了關(guān)聯(lián),并且處于Session的有效期內(nèi),那么這個(gè)對(duì)象就處于持久態(tài)。Sessionsession=SessionFactory.openSession();Transactiontr=session.beginTransaction();//創(chuàng)建一個(gè)事務(wù)CustomertestPerson=newCustomer();testPerson.setFirstname("Jerry");testPerson.setLanguage("Chinese");//至此,testPerson仍為瞬時(shí)態(tài)session.save(testPerson);//該語(yǔ)句執(zhí)行后,testPerson變?yōu)槌志脩B(tài),被Hibernate納入管理器mit();//提交事務(wù),此時(shí)會(huì)將testPerson的數(shù)據(jù)同步到數(shù)據(jù)庫(kù)中5.5.1對(duì)象狀態(tài)脫離態(tài)
當(dāng)與持久對(duì)象關(guān)聯(lián)的Session被關(guān)閉后,該對(duì)象就變?yōu)槊撾x態(tài)了。Sessionsession=SessionFactory.openSession();Transactiontr=session.beginTransaction();CustomertestPerson=newCustomer();testPerson.setFirstname("Jerry");testPerson.setLanguage("Chinese");session.save(testPerson);mit();session.close();//至此,testPerson對(duì)象進(jìn)入脫離態(tài)5.5.1對(duì)象狀態(tài)圖5-7對(duì)象狀態(tài)轉(zhuǎn)換圖5.5.2創(chuàng)建持久化類(lèi)持久化類(lèi)是指其對(duì)象實(shí)例需要被Hibernate持久化到數(shù)據(jù)庫(kù)中的類(lèi),創(chuàng)建持久化類(lèi)需要注意以下幾點(diǎn):持久化類(lèi)符合JavaBean的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的getXXX()和setXXX()方法。name屬性的get方法為getName()如果持久化類(lèi)的屬性為boolean類(lèi)型,那么他的get方法名即可以用get作為前綴,也可以用is作為前綴持久化類(lèi)需有一個(gè)id屬性,用來(lái)唯一標(biāo)識(shí)類(lèi)的每一個(gè)對(duì)象持久化類(lèi)必須提供一個(gè)不帶參的默認(rèn)構(gòu)造方法5.5.2創(chuàng)建持久化類(lèi)創(chuàng)建一個(gè)簡(jiǎn)單的持久化類(lèi)示例Customer.javapublicclassCustomer{privateIntegerid;//對(duì)象idprivateStringusername;//用戶名privateStringpassword;//密碼
publicIntegergetId(){ returnid;}publicvoidsetId(Integerid){ this.id=id;}publicStringgetUserName(){ returnusername;}publicvoidsetUserName(Stringusername){ this.username=username;}publicStringgetPassword(){ returnpassword;}publicvoidsetPassword(Stringpassword){ this.password=password;}}5.5.2創(chuàng)建持久化類(lèi)該持久化類(lèi)包括三個(gè)屬性信息:id、用戶名、密碼。每個(gè)屬性都可以通過(guò)映射文件Customer.hbm.xml與數(shù)據(jù)表中的字段建立對(duì)應(yīng)關(guān)系。創(chuàng)建好持久化類(lèi)之后,就可以通過(guò)Session對(duì)象實(shí)例對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作publicclassHibernateTest{publicstaticvoidmain(String[]args){SessionFactorysessions=newConfiguration().configure().buildSessionFactory();Sessionsession=sessions.openSession();Transactiontx=null;try{tx=session.beginTransaction();Customercus=newCustomer();cus.setUserName("zhangsan");cus.setPassword("123456");System.out.println("開(kāi)始插入數(shù)據(jù)到數(shù)據(jù)庫(kù)......");session.save(cus);mit();}}5.6Hibernate的對(duì)象—關(guān)系映射文件Hibernate映射文件中包含了基本的映射信息,它描述了每一個(gè)持久化類(lèi)與其對(duì)應(yīng)的數(shù)據(jù)表之間的關(guān)聯(lián)信息圖5-8對(duì)象—關(guān)系映射文件所處位置對(duì)象—關(guān)系映射文件(1)創(chuàng)建數(shù)據(jù)庫(kù)表CUSTOMERS
在CUSTOMERS表中定義了三個(gè)字段,ID、NAME和PASSWORD,其中ID字段作為主鍵與持久化類(lèi)Customer的id屬性對(duì)應(yīng)。createtableCUSTOMERS(IDint(20)notnullprimarykeyauto_increment,NAMEvarchar(20)notnull,PASSWORDvarchar(20)notnull);對(duì)象—關(guān)系映射文件(2)創(chuàng)建對(duì)象—關(guān)系映射文件
創(chuàng)建映射文件Customer.hbm.xml,把對(duì)象—關(guān)系映射的邏輯放在此文件中。<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mappingpackage="hibernate.ch05"><classname="Customer"table="T_CUSTOMERS"><idname="id"column="ID"type="integer"><generatorclass="identity"/></id><propertyname="username"column="NAME"type="string"length="20"></property><propertyname="password"column="PASSWORD"type="string"length="20"></property></class></hibernate-mapping>對(duì)象—關(guān)系映射文件<hibernate-mapping>元素在映射文件中,<hibernate-mapping>是對(duì)象—關(guān)系映射的根元素,其他元素必須嵌入其內(nèi)。屬性功能描述默認(rèn)值schema數(shù)據(jù)庫(kù)的schema名稱(chēng)
auto_import設(shè)定在映射文件中是否可以在查詢語(yǔ)言中使用非完整類(lèi)名。Truedefault-cascade默認(rèn)的級(jí)聯(lián)方式Nonedefault-lazy對(duì)于沒(méi)有設(shè)定延遲加載的類(lèi)和集合是否設(shè)定延遲加載Truedefault-access屬性訪問(wèn)方式Propertycatalog數(shù)據(jù)庫(kù)的catalog名稱(chēng)
package映射文件中類(lèi)默認(rèn)的包名
表5-2<hibernate-mapping>元素屬性對(duì)象—關(guān)系映射文件<class>元素它用來(lái)描述持久化類(lèi)與數(shù)據(jù)庫(kù)中表的映射關(guān)系。其中name屬性指定類(lèi)名,table屬性指定所對(duì)應(yīng)的表名。<id>元素它用來(lái)描述持久化類(lèi)Customer的OID與數(shù)據(jù)表的主鍵的映射。其中name屬性指定類(lèi)的主鍵,column指定表的主鍵。<property>元素property元素用于描述普通字段的關(guān)聯(lián),即某個(gè)對(duì)象的屬性與數(shù)據(jù)表中字段的對(duì)應(yīng)關(guān)系。5.7Hibernate關(guān)系映射5.7.1一對(duì)一關(guān)聯(lián)5.7.2一對(duì)多關(guān)聯(lián)5.7.3多對(duì)多關(guān)聯(lián)5.7.1一對(duì)一關(guān)聯(lián)一對(duì)一關(guān)聯(lián)比較容易理解,即A對(duì)象與B對(duì)象一一對(duì)應(yīng)。例如,現(xiàn)假設(shè)學(xué)校宿舍是單人間,那么學(xué)生對(duì)象Student和宿舍對(duì)象Dormitory就是一對(duì)一關(guān)系,即一個(gè)學(xué)生只能住一個(gè)宿舍,而一個(gè)宿舍里也只能住一個(gè)學(xué)生。要建立它們之間的一對(duì)一關(guān)聯(lián),可以使用<one-to-one>元素進(jìn)行設(shè)置。首先需要在Student對(duì)象的映射文件Student.hbm.xml中定義到Dormitory對(duì)象的關(guān)聯(lián)5.7.1一對(duì)一關(guān)聯(lián)<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><classname="sec1.Student"table="STUDENT"><idname="id"column="ID"type="integer"><generatorclass="identity"/></id><propertyname="name"column="NAME"type="string"length="20"></property></class>
<one-to-onename="dormitory"class="Dormitory"></hibernate-mapping>5.7.1一對(duì)一關(guān)聯(lián)<one-to-onename="student"class="Student"constrainted="true">同樣的,還需要在Dormitory對(duì)象的映射文件Dormitory.hbm.xml中定義到Student對(duì)象的關(guān)聯(lián)其中<one-to-one>元素屬性如表5-8所示。屬性功能描述默認(rèn)值name映射類(lèi)屬性的名稱(chēng)
class映射的目標(biāo)類(lèi)名稱(chēng)
cascade操作時(shí)的級(jí)聯(lián)關(guān)系
constrainted當(dāng)前類(lèi)對(duì)應(yīng)的表與被關(guān)聯(lián)的表之間是否存在外鍵約束falsefetch抓取數(shù)據(jù)的策略
property-ref指定關(guān)聯(lián)類(lèi)的屬性名,此屬性和本類(lèi)的主鍵相對(duì)應(yīng)關(guān)聯(lián)類(lèi)的主鍵accessHibernate訪問(wèn)這個(gè)屬性的策略propertyformula定義一個(gè)SQL表達(dá)式來(lái)計(jì)算這個(gè)屬性的值
lazy指定對(duì)于此關(guān)聯(lián)對(duì)象是否使用延遲加載以及延遲加載的策略proxyentity-name被關(guān)聯(lián)類(lèi)的實(shí)體名
5.7.1一對(duì)一
注解@OneToOnecascade={CascadeType.REFRESH}的含義是只是查詢級(jí)聯(lián),它還有其他3個(gè)類(lèi)型:CascadeType.MERGE級(jí)聯(lián)更新CascadeType.PERSIST級(jí)聯(lián)保存CascadeType.REMOVE級(jí)聯(lián)刪除optional=false定義關(guān)聯(lián)類(lèi)不一定要存在@JoinColumn關(guān)聯(lián)的對(duì)象的字段5.7.2一對(duì)多關(guān)聯(lián)對(duì)于一對(duì)多關(guān)聯(lián)的定義,Dormitory與Student之間是一對(duì)多關(guān)聯(lián),那么Dormitory對(duì)象的實(shí)例就要對(duì)應(yīng)多個(gè)Student對(duì)象的實(shí)例。在Hibernate中這種關(guān)聯(lián)通過(guò)集合對(duì)象來(lái)處理,這里使用<set>元素完成配置。在Dormitory.hbm.xml映射文件中添加<one-to-many>元素其中<key>標(biāo)簽指定對(duì)應(yīng)字段,一對(duì)多關(guān)聯(lián)映射通常在多的一端維護(hù)關(guān)系。<setname="student"inverse="true"cascade="save-update"><keycolumn="Dorm_id"/><one-to-manyclass="Student"/></set>5.7.2多對(duì)一與一對(duì)多反向,Student與Dormitory之間是多對(duì)一關(guān)聯(lián),則需要在Student.hbm.xml映射文件中添加<many-to-one>元素值得注意的是,<key>標(biāo)簽和<many-to-one>標(biāo)簽加入的字段必須保持一直,否則會(huì)產(chǎn)生數(shù)據(jù)混亂。<many-to-onename="dormitory"column="Dorm_id"/>5.7.3多對(duì)多關(guān)聯(lián)例如學(xué)生Student對(duì)象與課程Course對(duì)象之間就是多對(duì)多關(guān)聯(lián),即一個(gè)學(xué)生可以選修多門(mén)課程,而一門(mén)課程可以被多名學(xué)生選修。要完成多對(duì)多關(guān)聯(lián)配置,需要在兩個(gè)對(duì)象的映射文件中同時(shí)進(jìn)行配置。與此同時(shí),還需要?jiǎng)?chuàng)建一張中間表t_stu_cour。首先,在Student.hbm.xml中添加以下代碼<setname="course"table="t_stu_cour"inverse="true"cascade="save-update"><keycolumn="Stu_id"/><many-to-manyclass="Course"column="Cour_id"/></set>5.7.3多對(duì)多關(guān)聯(lián)同樣,在Course.hbm.xml映射文件中添加以下代碼。其中Stu_id和Cour_id是中間表t_stu_cour中的兩個(gè)字段<setname="student"table="t_stu_cour"inverse="true"cascade="save-update"><keycolumn="Cour_id"/><many-to-manyclass="Student"column="Stu_id"/></set>5.7.3多對(duì)多關(guān)聯(lián)<many-to-many>子元素屬性如表5-11所示屬性功能描述默認(rèn)值column中間關(guān)聯(lián)表中映射到關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段
class關(guān)聯(lián)的目標(biāo)類(lèi)
fetch設(shè)置抓取數(shù)據(jù)的策略selectlazy指定對(duì)于此關(guān)聯(lián)對(duì)象是否使用延遲加載策略proxynot-found指定外鍵引用的數(shù)據(jù)不存在時(shí)的處理方式exceptionentity-name被關(guān)聯(lián)類(lèi)的實(shí)體名
formula定義一個(gè)SQL表達(dá)式來(lái)計(jì)算此屬性的值
表5-11<many-to-many>元素屬性5.8通過(guò)HibernateAPI操縱數(shù)據(jù)庫(kù)(1)創(chuàng)建一個(gè)Configuration對(duì)象實(shí)例
創(chuàng)建一個(gè)Configuration對(duì)象實(shí)例,為接下來(lái)讀取配置文件做好準(zhǔn)備工作。(2)讀取配置文件
默認(rèn)情況下,Hibernate會(huì)在CLASSPATH所指定的路徑下尋找hibernate.cfg.xml文件或者perties文件。讀取配置文件的工作是通過(guò)Configuration對(duì)象的configure()方法完成。Configurationconfig=newConfiguration();5.8通過(guò)HibernateAPI操縱數(shù)據(jù)庫(kù)(3)創(chuàng)建SessionFactory對(duì)象實(shí)例調(diào)用Configuration類(lèi)的buildSessionFactory()方法創(chuàng)建一個(gè)SessionFactory對(duì)象實(shí)例,并把Configuration對(duì)象所包含的所有配置信息拷貝到SessionFactory對(duì)象的緩存中(4)創(chuàng)建Session對(duì)象Hibernate初始化完成后,就可以調(diào)用SessionFactory對(duì)象的oepnSession()方法創(chuàng)建Session對(duì)象實(shí)例,通過(guò)Session對(duì)象執(zhí)行訪問(wèn)數(shù)據(jù)庫(kù)的操作。Session接口提供數(shù)據(jù)庫(kù)操作方法save()方法:將Java對(duì)象保存至數(shù)據(jù)庫(kù)。當(dāng)運(yùn)行session.save(cus)方法時(shí),Hibernate執(zhí)行以下SQL語(yǔ)句Sessionsession=sessions.openSession();Transactiontx=session.beginTransaction();Customercus=newCustomer();cus.setUserName("zhangsan");cus.setPassword("123456");session.save(cus);mit();insertintoCUSTOMERS(ID,NAME,PASSWORD)values(1,'zhangsan','123456');Session接口提供數(shù)據(jù)庫(kù)操作方法update()方法:更新數(shù)據(jù)庫(kù)中的Java對(duì)象。Sessionsession=sessions.openSession();Transactiontx=session.beginTransaction();Customercus=newCustomer();cus.setId("2");cus.setUserName("wangwu");cus.setPassword("225599");session.update(cus);mit();Session接口提供數(shù)據(jù)庫(kù)操作方法delete()方法:刪除數(shù)據(jù)庫(kù)中的Java對(duì)象值得注意的是,刪除操作的依據(jù)是根據(jù)這個(gè)實(shí)體對(duì)象的標(biāo)識(shí)符(主鍵)來(lái)進(jìn)行的。Sessionsession=sessions.openSession();Transactiontx=session.beginTransaction();Customercus=newCustomer();cus.setId("1");session.delete(cus);mit();Session接口提供數(shù)據(jù)庫(kù)操作方法load()方法:從數(shù)據(jù)庫(kù)中加載Java對(duì)象load()方法與get()類(lèi)似,都是通過(guò)對(duì)象的標(biāo)識(shí)符(主鍵)找到數(shù)據(jù)表中對(duì)應(yīng)的記錄。Sessionsession=sessions.openSession();Transactiontx=session.beginTransaction();Customercus=newCustomer();cus=session.load(Customer.class,"2");mit();Session接口提供數(shù)據(jù)庫(kù)操作方法get()方法:通過(guò)標(biāo)識(shí)符得到指定類(lèi)的Java對(duì)象實(shí)例當(dāng)查找的記錄不存在時(shí),get()方法會(huì)返回null,而load()方法將會(huì)拋出一個(gè)HibernateException異常。load()方法可以返回實(shí)體的代理類(lèi)實(shí)例,而get()方法只能直接返回實(shí)體類(lèi)。load()方法可以充分利用Hibernate的內(nèi)部緩存和二級(jí)緩存中現(xiàn)有的數(shù)據(jù),而get()方法只能在Hibernate內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找。Session接口提供數(shù)據(jù)庫(kù)操作方法find()方法:從數(shù)據(jù)庫(kù)中查詢Java對(duì)象tx=session.beginTransaction();Listcustomers=session.find("fromCustomerascusorderbycus.idasc");mit();5.9在MyEc
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)水利改造升級(jí)技術(shù)應(yīng)用合同
- 旅游地產(chǎn)投資合同審查策略
- 建筑供滑雪場(chǎng)人工費(fèi)施工合同
- 會(huì)計(jì)服務(wù)外包服務(wù)合同范本
- 城市機(jī)場(chǎng)廣告牌施工合同
- 工業(yè)廠房屋面瓦安裝協(xié)議
- 動(dòng)漫產(chǎn)業(yè)質(zhì)檢崗位聘用合同模板
- 造紙工程私人施工合同樣式
- 消防工程勞務(wù)合同模板
- 建筑工程防雷施工合同范本
- 《大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)》期末復(fù)習(xí)題庫(kù)(含答案)
- 形式邏輯新解智慧樹(shù)知到期末考試答案章節(jié)答案2024年上海財(cái)經(jīng)大學(xué)
- 2024年漢口銀行股份有限公司招聘筆試沖刺題(帶答案解析)
- 集成電路高可靠高密度封裝(一期)項(xiàng)目可行性研究報(bào)告
- 《韓國(guó)的語(yǔ)言》課后答案
- 寵物醫(yī)療創(chuàng)新創(chuàng)業(yè)
- 報(bào)價(jià)單(產(chǎn)品報(bào)價(jià)單)
- 項(xiàng)目經(jīng)理及主要管理人員能力水平
- 工程倫理-工程案例分析
- 纜車(chē)合唱鋼琴伴奏譜
- 小學(xué)四年級(jí)上冊(cè)數(shù)學(xué)集體備課-記錄
評(píng)論
0/150
提交評(píng)論