成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate的多對(duì)一和一對(duì)多操作實(shí)例

開發(fā) 后端
Hibernate的一對(duì)多和多對(duì)一操作是非常方便的,如果在減少數(shù)據(jù)庫復(fù)雜度的原則來說,把一些邏輯處理放在持久層,還是一個(gè)比較常見的方法。

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

1、多對(duì)一和一對(duì)多概念

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

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

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

這里面有兩個(gè)表單,一個(gè)CUSTOMER,客戶表單,一個(gè)是ORDERS,訂單表單。生成客戶表單,這個(gè)是在SQLServer里面做的,其實(shí)其他都一樣,因?yàn)檫壿嬯P(guān)系在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是對(duì)應(yīng)客戶主鍵,也非空,這里不做外鍵設(shè)置。

  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  

3、Hibernate設(shè)定

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

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

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

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

而對(duì)應(yīng)hbm文檔,就是map文檔如下:

  1. CUSTOMER.hbm.xml  
  2. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4. <!--  
  5. MappingfileautogeneratedbyMyEclipsePersistenceTools  
  6. --> 
  7. <hibernate-mapping> 
  8. <classnameclassname="onetomany.Customer"table="CUSTOMER"schema="dbo"catalog="DBTEST"> 
  9. <idnameidname="id"type="java.lang.Long"> 
  10. <columnnamecolumnname="id"precision="18"scale="0"/> 
  11. <generatorclassgeneratorclass="increment"/> 
  12. </id> 
  13. <propertynamepropertyname="name"type="java.lang.String"> 
  14. <columnnamecolumnname="name"length="50"/> 
  15. </property> 
  16. <propertynamepropertyname="age"type="java.lang.Integer"> 
  17. <columnnamecolumnname="age"/> 
  18. </property> 
  19. <setnamesetname="orderses"inverse="true"lazy="true"cascade="all"> 
  20. <key> 
  21. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/> 
  22. </key> 
  23. <one-to-manyclassone-to-manyclass="onetomany.Orders"/> 
  24. </set> 
  25. </class> 
  26. </hibernate-mapping> 

#p#
這個(gè)里面,其他都很簡答了,其中<generatorclass="increment"/>表示主鍵值自動(dòng)增加,這個(gè)主要針對(duì)字符串對(duì)應(yīng)的,主要體現(xiàn)多對(duì)以的是:

  1. <setnamesetname="orderses"inverse="true"lazy="true"cascade="all"> 
  2. <key> 
  3. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/> 
  4. </key> 
  5. <one-to-manyclassone-to-manyclass="onetomany.Orders"/> 
  6. </set> 

其中,set表示,對(duì)應(yīng)集合;fetch和lazy主要是用來級(jí)聯(lián)查詢的,而cascade和inverse主要是用來級(jí)聯(lián)插入和修改的,這幾個(gè)主要包括對(duì)集合的控制。<one-to-manyclass="onetomany.Orders"/>表示對(duì)應(yīng)類,即set里面包含的類,而key主要是用于確定set里面對(duì)應(yīng)表單列。

  1. ORDERS的hbm  
  2. <?xmlversionxmlversion="1.0"encoding="utf-8"?> 
  3. <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  5. <!--  
  6. MappingfileautogeneratedbyMyEclipsePersistenceTools  
  7. --> 
  8. <hibernate-mapping> 
  9. <classcatalogclasscatalog="DBTEST"name="onetomany.Orders"schema="dbo"table="ORDERS"> 
  10. <idnameidname="id"type="java.lang.Long"> 
  11. <columnnamecolumnname="id"precision="18"scale="0"/> 
  12. <generatorclassgeneratorclass="increment"/> 
  13. </id> 
  14. <many-to-oneclassmany-to-oneclass="onetomany.Customer"fetch="select"name="customer"> 
  15. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"/> 
  16. </many-to-one> 
  17. <propertygeneratedpropertygenerated="never"lazy="false"name="orderNumber"type="java.lang.String"> 
  18. <columnlengthcolumnlength="50"name="ORDER_NUMBER"/> 
  19. </property> 
  20. <propertygeneratedpropertygenerated="never"lazy="false"name="price"type="java.lang.Double"> 
  21. <columnnamecolumnname="PRICE"precision="18"scale="3"/> 
  22. </property> 
  23. </class> 
  24. </hibernate-mapping> 
  25. <many-to-oneclassmany-to-oneclass="onetomany.Customer"fetch="select"name="customer"> 
  26. <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"/> 
  27. </many-to-one> 

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

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

4、驗(yàn)證效果

1、新增用戶

如果新增一個(gè)用戶,該用戶里面包含有兩個(gè)表單,那么,由于持久層已經(jīng)實(shí)現(xiàn)了邏輯關(guān)系,只要用戶類里面的set包含了表單,則表單可以自動(dòng)增加。實(shí)現(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); 

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

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

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

2、刪除操作

  1. List<Customer>csList=cd.findByProperty("name","王小虎");  
  2. for(Customercs:csList){  
  3. cd.delete(cs);  

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

5、小小總結(jié)

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

【編輯推薦】

  1. Hibernate批量更新與刪除實(shí)例淺析
  2. 簡述Hibernate Synchronizer學(xué)習(xí)筆記
  3. Hibernate column屬性簡介
  4. 概括Hibernate查詢語言
  5. Hibernate cartridge學(xué)習(xí)總結(jié)
責(zé)任編輯:王曉東 來源: ITPUB個(gè)人空間
相關(guān)推薦

2009-09-22 09:55:58

Hibernate實(shí)例

2009-06-04 16:14:22

Hibernate一對(duì)Hibernate一對(duì)Hibernate多對(duì)

2009-07-21 17:31:39

iBATIS一對(duì)多映射

2023-06-12 08:09:01

FlaskSQLAlchemy

2009-06-03 16:18:16

Hibernate關(guān)系代碼實(shí)例

2022-02-18 11:05:25

Jpa配置Address

2009-06-04 10:34:19

Hibernate一對(duì)一對(duì)多關(guān)系配置

2009-06-03 16:27:27

Hibernate一對(duì)一關(guān)系

2012-03-21 11:43:41

JavaHibernate

2009-06-18 14:22:06

Hibernate多對(duì)Hibernate

2009-09-23 10:37:50

Hibernate一對(duì)

2010-07-07 08:33:09

SQL Server學(xué)

2012-02-08 13:34:08

HibernateJava

2009-09-23 10:57:02

Hibernate一對(duì)

2009-06-24 15:51:47

Entity Bean一對(duì)多映射

2011-03-25 10:49:30

Join一對(duì)多

2010-09-10 13:45:18

SQLCOUNT()函數(shù)

2011-08-17 10:28:53

多對(duì)多查詢SQL Server

2009-07-21 17:39:50

iBATIS的多對(duì)多映

2019-05-12 14:10:07

物聯(lián)網(wǎng)DDOS網(wǎng)絡(luò)攻擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧洲精品一区 | 亚洲网站观看 | 欧美成年网站 | 韩日一区二区三区 | 中文字幕在线一区二区三区 | 久久人| 国产欧美性成人精品午夜 | 久久久久久久久久爱 | 亚洲国产中文字幕 | 国产精品视频在线观看 | 免费观看的av毛片的网站 | 日韩在线中文字幕 | 毛片免费在线 | 精品国产成人 | 4hu最新网址| 国产羞羞视频在线观看 | 欧美国产亚洲一区二区 | 亚洲国产成人在线 | 91精品久久久久久久久久入口 | 成人国产精品一级毛片视频毛片 | 日韩精品成人网 | 日韩精品免费播放 | 在线视频 亚洲 | 国产成人精品久久二区二区91 | 黄色小视频大全 | 亚洲精品视频在线播放 | 色网站入口 | 国产精品欧美一区二区三区不卡 | 亚洲精品久久久蜜桃网站 | 午夜精品久久久久久久久久久久久 | 毛片在线免费 | 国产精品不卡 | 久久久999国产精品 中文字幕在线精品 | 久久综合一区 | 91porn成人精品 | 日本亚洲欧美 | 国产美女精品 | 女朋友的闺蜜3韩国三级 | 成人在线精品视频 | 欧美精品片 | 日韩国产在线 |