日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Hibernate的多對一和一對多操作實例

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

專注于為中小企業(yè)提供成都網(wǎng)站設計、網(wǎng)站建設、外貿(mào)網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)南城免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

1、多對一和一對多概念

其實這個概念上來說很簡單,比如一個客戶可以有多個訂單,多個訂單屬于同一個客戶。就是最基本的一對多,和多對一。數(shù)據(jù)庫使用中,感覺多對一和一對多算是比較常見的邏輯關系了。

我曾經(jīng)做過一些數(shù)據(jù)庫,比如某些政府部門的,其表單很設計的很簡單粗糙,甚至連主鍵都沒有,完全靠在事務層補全這些關系。其實通過Hibernate持久層來實現(xiàn)邏輯關系也是很不錯的方法。下面的例子,就是數(shù)據(jù)庫邏輯上基本沒有定義,主要放在持久層里面。這個也主要是我對數(shù)據(jù)庫操作屬于半通水的原因。

2、數(shù)據(jù)庫層

這里面有兩個表單,一個CUSTOMER,客戶表單,一個是ORDERS,訂單表單。生成客戶表單,這個是在SQLServer里面做的,其實其他都一樣,因為邏輯關系在Hibernate上面,id是主鍵非空,其他可以為空:

 
 
 
  1. CREATETABLE[dbo].[CUSTOMER](
  2. [id][numeric](18,0)NOTNULL,
  3. [name][varchar](50)NULL,
  4. [age][int]NULL,
  5. CONSTRAINT[PK_CUSTOMER]PRIMARYKEY)

訂單表單

id為主鍵非空,CUSTOMER_id是對應客戶主鍵,也非空,這里不做外鍵設置。

 
 
 
  1. CREATETABLE[dbo].[ORDERS](
  2. [id][numeric](18,0)NULLPRIMARYKEY,
  3. [CUSTOMER_id][numeric](18,0)NOTNULL,
  4. [ORDER_NUMBER][varchar](50)NULL,
  5. [PRICE][numeric](18,3)NULL
  6. )

3、Hibernate設定

HIbernate里面,一對多的對象體現(xiàn),是客戶有一個集合set,set里面放著對應訂單,而多對一體現(xiàn),是訂單里面有一個CUSTOMER對象,表明該訂單所屬的客戶。其中,CUSTOMER類為:

 
 
 
  1. publicclassCustomerimplementsjava.io.Serializable{
  2. privateLongid;
  3. privateStringname;
  4. privateIntegerage;
  5. privateSetrderses=newHashSet();

后面的getXXX和setXXX方法就省去了,同樣訂單類就是:

 
 
 
  1. publicclassOrdersimplementsjava.io.Serializable{
  2. privateLongid;
  3. privateCustomercustomer;
  4. privateStringorderNumber;
  5. privateDoubleprice;

而對應hbm文檔,就是map文檔如下:

 
 
 
  1. CUSTOMER.hbm.xml
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

#p#
這個里面,其他都很簡答了,其中表示主鍵值自動增加,這個主要針對字符串對應的,主要體現(xiàn)多對以的是:

 
 
 

其中,set表示,對應集合;fetch和lazy主要是用來級聯(lián)查詢的,而cascade和inverse主要是用來級聯(lián)插入和修改的,這幾個主要包括對集合的控制。表示對應類,即set里面包含的類,而key主要是用于確定set里面對應表單列。

 
 
 
  1. ORDERS的hbm
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

表示CUSTOMER熟悉對應的類,和其作為key的列名,上面這些都可以在MyEclipse里面自動生成。另外注意的一點是,在生成的DAO里面,涉及表單操作的save()和delete()方法,必須要事件提交,數(shù)據(jù)庫才有反映??梢跃驮揌ibernate.xml,或者用下面這樣代碼來實現(xiàn):

 
 
 
  1. Sessionse=getSession();
  2. Transactiontx=se.beginTransaction();
  3. se.delete(persistentInstance);
  4. //se.save(instance);
  5. tx.commit();

4、驗證效果

1、新增用戶

如果新增一個用戶,該用戶里面包含有兩個表單,那么,由于持久層已經(jīng)實現(xiàn)了邏輯關系,只要用戶類里面的set包含了表單,則表單可以自動增加。實現(xiàn)代碼:

 
 
 
  1. CustomerDAOcd=newCustomerDAO();
  2. Customerxd=newCustomer("王小虎",20,null);
  3. Ordersord1=newOrders();
  4. ord1.setCustomer(xd);
  5. ord1.setOrderNumber("王小虎的買單1");
  6. Ordersord2=newOrders();
  7. ord2.setCustomer(xd);
  8. ord2.setOrderNumber("王小虎的買單2");
  9. Setrderses=newHashSet();
  10. orderses.add(ord1);
  11. orderses.add(ord2);
  12. xd.setOrderses(orderses);
  13. cd.save(xd);

代碼里面,加入一個王小虎用戶。兩個訂單,通過setOrderses加入,只使用cd.save這一個對持久層操作。完成后查詢:

 
 
 
  1. 王小虎
  2. =================================
  3. 王小虎的買單1
  4. 王小虎的買單2

顯示,CUSTOMER里面加入了王小虎,ORDERS里面也加入他的訂單。

2、刪除操作

 
 
 
  1. ListcsList=cd.findByProperty("name","王小虎");
  2. for(Customercs:csList){
  3. cd.delete(cs);
  4. }

這個很簡單了,通過其中findByProperty("name","王小虎");對應SQL為deletefromtableCUSTOMERwherename=''王小虎';刪除了王小虎,而ORDERS里面,王小虎對應的表單也同時被刪除。

5、小小總結(jié)

Hibernate的多對一和一對多處理,還是挺方便的,如果在減少數(shù)據(jù)庫復雜度的原則來說,把一些邏輯處理放在持久層是一個常見的方法。


當前題目:Hibernate的多對一和一對多操作實例
分享路徑:http://m.5511xx.com/article/cdodscj.html