溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hibernate中怎么實現(xiàn)多對一和一對多操作

發(fā)布時間:2021-07-27 16:21:13 來源:億速云 閱讀:221 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Hibernate中怎么實現(xiàn)多對一和一對多操作,文章內(nèi)容豐富且以專業(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  <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--  MappingfileautogeneratedbyMyEclipsePersistenceTools  --> <hibernate-mapping> <classnameclassname="onetomany.Customer"table="CUSTOMER"schema="dbo"catalog="DBTEST"> <idnameidname="id"type="java.lang.Long"> <columnnamecolumnname="id"precision="18"scale="0"/> <generatorclassgeneratorclass="increment"/> </id> <propertynamepropertyname="name"type="java.lang.String"> <columnnamecolumnname="name"length="50"/> </property> <propertynamepropertyname="age"type="java.lang.Integer"> <columnnamecolumnname="age"/> </property> <setnamesetname="orderses"inverse="true"lazy="true"cascade="all"> <key> <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"not-null="true"/> </key> <one-to-manyclassone-to-manyclass="onetomany.Orders"/> </set> </class> </hibernate-mapping>


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

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

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

ORDERS的hbm  <?xmlversionxmlversion="1.0"encoding="utf-8"?> <!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--  MappingfileautogeneratedbyMyEclipsePersistenceTools  --> <hibernate-mapping> <classcatalogclasscatalog="DBTEST"name="onetomany.Orders"schema="dbo"table="ORDERS"> <idnameidname="id"type="java.lang.Long"> <columnnamecolumnname="id"precision="18"scale="0"/> <generatorclassgeneratorclass="increment"/> </id> <many-to-oneclassmany-to-oneclass="onetomany.Customer"fetch="select"name="customer"> <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"/> </many-to-one> <propertygeneratedpropertygenerated="never"lazy="false"name="orderNumber"type="java.lang.String"> <columnlengthcolumnlength="50"name="ORDER_NUMBER"/> </property> <propertygeneratedpropertygenerated="never"lazy="false"name="price"type="java.lang.Double"> <columnnamecolumnname="PRICE"precision="18"scale="3"/> </property> </class> </hibernate-mapping> <many-to-oneclassmany-to-oneclass="onetomany.Customer"fetch="select"name="customer"> <columnnamecolumnname="CUSTOMER_id"precision="18"scale="0"/> </many-to-one>

表示CUSTOMER熟悉對應(yīng)的類,和其作為key的列名,上面這些都可以在MyEclipse里面自動生成。另外注意的一點是,在生成的DAO里面,涉及表單操作的save()和delete()方法,必須要事件提交,數(shù)據(jù)庫才有反映??梢跃驮揌ibernate.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、刪除操作

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

上述就是小編為大家分享的Hibernate中怎么實現(xiàn)多對一和一對多操作了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI