新聞中心
Hibernate的一對(duì)多和多對(duì)一操作真的很方便,如果系統(tǒng)采用Hibernate作為持久層,完全可以把對(duì)應(yīng)的一對(duì)多和多對(duì)一邏輯關(guān)系放在Hibernate里面控制,減少數(shù)據(jù)庫(kù)的負(fù)擔(dān),而且也更清晰。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)南城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1、多對(duì)一和一對(duì)多概念
其實(shí)這個(gè)概念上來(lái)說(shuō)很簡(jiǎn)單,比如一個(gè)客戶可以有多個(gè)訂單,多個(gè)訂單屬于同一個(gè)客戶。就是最基本的一對(duì)多,和多對(duì)一。數(shù)據(jù)庫(kù)使用中,感覺(jué)多對(duì)一和一對(duì)多算是比較常見(jiàn)的邏輯關(guān)系了。
我曾經(jīng)做過(guò)一些數(shù)據(jù)庫(kù),比如某些政府部門的,其表單很設(shè)計(jì)的很簡(jiǎn)單粗糙,甚至連主鍵都沒(méi)有,完全靠在事務(wù)層補(bǔ)全這些關(guān)系。其實(shí)通過(guò)Hibernate持久層來(lái)實(shí)現(xiàn)邏輯關(guān)系也是很不錯(cuò)的方法。下面的例子,就是數(shù)據(jù)庫(kù)邏輯上基本沒(méi)有定義,主要放在持久層里面。這個(gè)也主要是我對(duì)數(shù)據(jù)庫(kù)操作屬于半通水的原因。
2、數(shù)據(jù)庫(kù)層
這里面有兩個(gè)表單,一個(gè)CUSTOMER,客戶表單,一個(gè)是ORDERS,訂單表單。生成客戶表單,這個(gè)是在SQLServer里面做的,其實(shí)其他都一樣,因?yàn)檫壿嬯P(guān)系在Hibernate上面,id是主鍵非空,其他可以為空:
- CREATETABLE[dbo].[CUSTOMER](
- [id][numeric](18,0)NOTNULL,
- [name][varchar](50)NULL,
- [age][int]NULL,
- CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)
訂單表單
id為主鍵非空,CUSTOMER_id是對(duì)應(yīng)客戶主鍵,也非空,這里不做外鍵設(shè)置。
- CREATETABLE[dbo].[ORDERS](
- [id][numeric](18,0)NULLPRIMARYKEY,
- [CUSTOMER_id][numeric](18,0)NOTNULL,
- [ORDER_NUMBER][varchar](50)NULL,
- [PRICE][numeric](18,3)NULL
- )
3、Hibernate設(shè)定
HIbernate里面,一對(duì)多的對(duì)象體現(xiàn),是客戶有一個(gè)集合set,set里面放著對(duì)應(yīng)訂單,而多對(duì)一體現(xiàn),是訂單里面有一個(gè)CUSTOMER對(duì)象,表明該訂單所屬的客戶。其中,CUSTOMER類為:
- publicclassCustomerimplementsjava.io.Serializable{
- privateLongid;
- privateStringname;
- privateIntegerage;
- privateSetrderses=newHashSet();
- }
后面的getXXX和setXXX方法就省去了,同樣訂單類就是:
- publicclassOrdersimplementsjava.io.Serializable{
- privateLongid;
- privateCustomercustomer;
- privateStringorderNumber;
- privateDoubleprice;
- }
而對(duì)應(yīng)hbm文檔,就是map文檔如下:
- CUSTOMER.hbm.xml
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
#p#
這個(gè)里面,其他都很簡(jiǎn)答了,其中
其中,set表示,對(duì)應(yīng)集合;fetch和lazy主要是用來(lái)級(jí)聯(lián)查詢的,而cascade和inverse主要是用來(lái)級(jí)聯(lián)插入和修改的,這幾個(gè)主要包括對(duì)集合的控制。
- ORDERS的hbm
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
表示CUSTOMER熟悉對(duì)應(yīng)的類,和其作為key的列名,上面這些都可以在MyEclipse里面自動(dòng)生成。另外注意的一點(diǎn)是,在生成的DAO里面,涉及表單操作的save()和delete()方法,必須要事件提交,數(shù)據(jù)庫(kù)才有反映??梢跃驮揌ibernate.xml,或者用下面這樣代碼來(lái)實(shí)現(xiàn):
- Sessionse=getSession();
- Transactiontx=se.beginTransaction();
- se.delete(persistentInstance);
- //se.save(instance);
- tx.commit();
4、驗(yàn)證效果
1、新增用戶
如果新增一個(gè)用戶,該用戶里面包含有兩個(gè)表單,那么,由于持久層已經(jīng)實(shí)現(xiàn)了邏輯關(guān)系,只要用戶類里面的set包含了表單,則表單可以自動(dòng)增加。實(shí)現(xiàn)代碼:
- CustomerDAOcd=newCustomerDAO();
- Customerxd=newCustomer("王小虎",20,null);
- Ordersord1=newOrders();
- ord1.setCustomer(xd);
- ord1.setOrderNumber("王小虎的買單1");
- Ordersord2=newOrders();
- ord2.setCustomer(xd);
- ord2.setOrderNumber("王小虎的買單2");
- Setrderses=newHashSet();
- orderses.add(ord1);
- orderses.add(ord2);
- xd.setOrderses(orderses);
- cd.save(xd);
代碼里面,加入一個(gè)王小虎用戶。兩個(gè)訂單,通過(guò)setOrderses加入,只使用cd.save這一個(gè)對(duì)持久層操作。完成后查詢:
- 王小虎
- =================================
- 王小虎的買單1
- 王小虎的買單2
顯示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的訂單。
2、刪除操作
- List
csList=cd.findByProperty("name","王小虎"); - for(Customercs:csList){
- cd.delete(cs);
- }
這個(gè)很簡(jiǎn)單了,通過(guò)其中findByProperty("name","王小虎");對(duì)應(yīng)SQL為deletefromtableCUSTOMERwherename=''王小虎';刪除了王小虎,而ORDERS里面,王小虎對(duì)應(yīng)的表單也同時(shí)被刪除。
5、小小總結(jié)
Hibernate的多對(duì)一和一對(duì)多處理,還是挺方便的,如果在減少數(shù)據(jù)庫(kù)復(fù)雜度的原則來(lái)說(shuō),把一些邏輯處理放在持久層是一個(gè)常見(jiàn)的方法。
網(wǎng)站標(biāo)題:Hibernate的多對(duì)一和一對(duì)多操作實(shí)例
文章路徑:http://www.5511xx.com/article/cdodscj.html


咨詢
建站咨詢
