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