這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Hibernate中怎么實現(xiàn)多對一和一對多操作,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)主營商丘網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),商丘h5小程序設(shè)計搭建,商丘網(wǎng)站營銷推廣歡迎商丘等地區(qū)企業(yè)咨詢
1、多對一和一對多概念
其實這個概念上來說很簡單,比如一個客戶可以有多個訂單,多個訂單屬于同一個客戶。就是最基本的一對多,和多對一。數(shù)據(jù)庫使用中,感覺多對一和一對多算是比較常見的邏輯關(guān)系了。
我曾經(jīng)做過一些數(shù)據(jù)庫,比如某些政府部門的,其表單很設(shè)計的很簡單粗糙,甚至連主鍵都沒有,完全靠在事務(wù)層補全這些關(guān)系。其實通過Hibernate持久層來實現(xiàn)邏輯關(guān)系也是很不錯的方法。下面的例子,就是數(shù)據(jù)庫邏輯上基本沒有定義,主要放在持久層里面。這個也主要是我對數(shù)據(jù)庫操作屬于半通水的原因。
2、數(shù)據(jù)庫層
這里面有兩個表單,一個CUSTOMER,客戶表單,一個是ORDERS,訂單表單。生成客戶表單,這個是在SQLServer里面做的,其實其他都一樣,因為邏輯關(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是對應(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里面,一對多的對象體現(xiàn),是客戶有一個集合set,set里面放著對應(yīng)訂單,而多對一體現(xiàn),是訂單里面有一個CUSTOMER對象,表明該訂單所屬的客戶。其中,CUSTOMER類為:
publicclassCustomerimplementsjava.io.Serializable{ privateLongid; privateStringname; privateIntegerage; privateSetrderses=newHashSet(); }
后面的getXXX和setXXX方法就省去了,同樣訂單類就是:
publicclassOrdersimplementsjava.io.Serializable{ privateLongid; privateCustomercustomer; privateStringorderNumber; privateDoubleprice; }
而對應(yīng)hbm文檔,就是map文檔如下:
CUSTOMER.hbm.xml
這個里面,其他都很簡答了,其中
其中,set表示,對應(yīng)集合;fetch和lazy主要是用來級聯(lián)查詢的,而cascade和inverse主要是用來級聯(lián)插入和修改的,這幾個主要包括對集合的控制。
ORDERS的hbm
表示CUSTOMER熟悉對應(yīng)的類,和其作為key的列名,上面這些都可以在MyEclipse里面自動生成。另外注意的一點是,在生成的DAO里面,涉及表單操作的save()和delete()方法,必須要事件提交,數(shù)據(jù)庫才有反映。可以就該Hibernate.xml,或者用下面這樣代碼來實現(xiàn):
Sessionse=getSession(); Transactiontx=se.beginTransaction(); se.delete(persistentInstance); //se.save(instance); tx.commit();
4、驗證效果
1、新增用戶
如果新增一個用戶,該用戶里面包含有兩個表單,那么,由于持久層已經(jīng)實現(xiàn)了邏輯關(guān)系,只要用戶類里面的set包含了表單,則表單可以自動增加。實現(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);
代碼里面,加入一個王小虎用戶。兩個訂單,通過setOrderses加入,只使用cd.save這一個對持久層操作。完成后查詢:
王小虎 ================================= 王小虎的買單1 王小虎的買單2
顯示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的訂單。
2、刪除操作
ListcsList=cd.findByProperty("name","王小虎"); for(Customercs:csList){ cd.delete(cs); }
上述就是小編為大家分享的Hibernate中怎么實現(xiàn)多對一和一對多操作了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。