生活随笔
收集整理的這篇文章主要介紹了
hibernate映射一对多双向关联关系实例
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在電子商務(wù)應(yīng)用中,經(jīng)常會(huì)有這樣的需求:根據(jù)給定的客戶,得到該客戶的所有訂單;根據(jù)給定的訂單,得到該訂單的所屬客戶。對(duì)于這種雙向關(guān)聯(lián)的情況,在Hibernate應(yīng)用中,也有人叫多對(duì)一雙向關(guān)聯(lián),只是叫法不同而已,都是通過(guò)映射一對(duì)多雙向關(guān)聯(lián)關(guān)系來(lái)實(shí)現(xiàn)的。
不管是多對(duì)一單向關(guān)聯(lián)還是(一對(duì)多)多對(duì)一雙向關(guān)聯(lián),在關(guān)系型數(shù)據(jù)庫(kù)中的表現(xiàn)方式都是一樣的,均通過(guò)外鍵參照來(lái)實(shí)現(xiàn)如圖4-18所示。
只是在持久化類與ORM映射文件中單向關(guān)聯(lián)與雙向關(guān)聯(lián)存在一些區(qū)別而已,如圖4-19所示。
?
?
持久化類Customer.java:
package?com.ORM;? import?java.io.Serializable;? import?java.util.*;? public?class?Customer?implements?Serializable{? ????private?java.lang.Integer?id;???????????????//ID號(hào)? ????private?java.lang.String?cname;?????????????????//客戶姓名? ????private?java.lang.String?bank;??????????????//銀行賬號(hào)? ????private?java.lang.String?phone;?????????????????//聯(lián)系電話? ????private?Set?orders?=?new?HashSet();?????????????//訂單集合? ????public?Customer(){}????? ????//省略上述各屬性的get/set方法對(duì)? }? 持久化類Orders.java:
package?com.ORM;? import?java.io.Serializable;? public?class?Orders?implements?Serializable{? ????private?java.lang.Integer?id;???????????????//ID號(hào)? ????private?java.lang.String?orderno;???????????????//訂單編號(hào)? ????private?java.lang.Double?money;?????????????????//訂單金額? ????private?Customer?customer;??????????????//訂單的所屬客戶? ????public?Orders(){}? ????//省略上述各屬性的get/set方法對(duì)? }? customer表與Customer類的ORM映射文件Customer.hbm.xml:
<hibernate-mapping?package="com.ORM">? ????<class?name="Customer"?table="customer">? ????????<id?name="id"?column="ID"?type="integer">? ????????????<generator?class="identity"/>? ????????</id>?? ????????<property?name="cname"?column="CNAME"?type="string"?/>? ????????<property?name="bank"?column="BANK"?type="string"?/>? ?
?
orders表與Orders類的ORM映射文件Orders.hbm.xml:
?
?
(1)創(chuàng)建供測(cè)試用的TestBean.java。
…… ? ????public?void?addCustomer(){? Customer?customer?=?new?Customer();? customer.setCname("張三");? customer.setBank("123456789123456789");? customer.setPhone("020-12345678");? dao.addCustomer(customer); ? ????}???? ????public?Customer?loadCustomer(Integer?id){? return?dao.loadCustomer(id);? ????}? ????public?void?addOrders(Customer?customer){? Orders?order?=?new?Orders();? order.setOrderno(new?Long(System.currentTimeMillis()).toString());? order.setMoney(new?Double(rnd.nextDouble()*10000));? //將Customer與Orders實(shí)例進(jìn)行雙向關(guān)聯(lián) ? order.setCustomer(customer); ? customer.getOrders().add(order); ? dao.addOrders(order); ? ????}???? ????public?Orders?loadOrders(Integer?id){? return?dao.loadOrders(id);? ????}? ……? (2)創(chuàng)建測(cè)試JSP頁(yè)面index.jsp。
<jsp:useBean?id="test"?class="com.bean.TestBean"?/>? ........... index.jsp運(yùn)行分析。
(1)執(zhí)行了test.addCustomer()以后,Hibernate向數(shù)據(jù)庫(kù)服務(wù)器提交的SQL語(yǔ)句為:
【SQL】insert?into?customer?(CNAME,?BANK,?PHONE)?values? ("張三",?"123456789123456789","020-12345678")? (2)執(zhí)行了test.loadCustomer(id)以后,Hibernate向數(shù)據(jù)庫(kù)服務(wù)器提交的SQL語(yǔ)句為:
【SQL】select?*?from?customer?where?ID=1? select?*?from?orders?where?CUSTOMER_ID=1? 由于Customer.hbm.xml中的lazy="false",在裝載Customer后,會(huì)立即裝載與當(dāng)前Customer對(duì)象一對(duì)多關(guān)聯(lián)的所有Orders對(duì)象。
(3)執(zhí)行了test.addOrders(customer);以后,Hibernate向數(shù)據(jù)庫(kù)服務(wù)器提交的SQL語(yǔ)句為:
【SQL】insert?into?orders(ORDERNO,MONEY,CUSTOMER_ID)? values("1163858590843",7158.76,1)? (4)執(zhí)行了test.loadOrders(newInteger(1));以后,Hibernate向數(shù)據(jù)庫(kù)服務(wù)器提交的SQL語(yǔ)句為:
【SQL】select?*?from?orders?where?ID=1? select?*?from?customer?where?ID=1? 由于Orders.hbm.xml中的lazy="false",在裝載Orders后,會(huì)立即裝載與當(dāng)前Orders對(duì)象多對(duì)一關(guān)聯(lián)的Customer對(duì)象。
index.jsp運(yùn)行效果如圖4-20所示。
分享:
6
總結(jié)
以上是生活随笔為你收集整理的hibernate映射一对多双向关联关系实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。