hibernate的一对多双向关联映射----客户和订单关系
生活随笔
收集整理的這篇文章主要介紹了
hibernate的一对多双向关联映射----客户和订单关系
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
客戶和訂單關系:客戶是一的一方,訂單是多的一方。
customer表:
CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , `CNAME` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `BANK` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `PHONE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`ID`) )orders表:
CUSTOMER_ID是外鍵!
CREATE TABLE `orders` ( `ID` int(4) NOT NULL AUTO_INCREMENT , `ORDERNO` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `MONEY` double(10,2) NULL DEFAULT NULL , `CUSTOMER_ID` int(4) NULL DEFAULT NULL , PRIMARY KEY (`ID`), FOREIGN KEY (`CUSTOMER_ID`) REFERENCES `customer` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE, INDEX `CUSTOMER_ID` (`CUSTOMER_ID`) USING BTREE )PO對象
Customer.java
package com.PO;import java.util.HashSet; import java.util.Set;/*** Company entity. @author tuke*/public class Customer implements java.io.Serializable { private Integer id; private String cname; //客戶名稱private String bank; //銀行賬號private String phone; //電話號碼private Set<Orders> orderses = new HashSet<Orders>(); //關聯另外一個類// Constructors/** default constructor */public Customer() {}/** full constructor */public Customer(String cname, String bank, String phone, Set<Orders> orderses) {this.cname = cname;this.bank = bank;this.phone = phone;this.orderses = orderses;}// Property accessorspublic Integer getId() {return this.id;} public void setId(Integer id) {this.id = id;}public String getCname() {return this.cname;} public void setCname(String cname) {this.cname = cname;}public String getBank() {return this.bank;}public void setBank(String bank) {this.bank = bank;}public String getPhone() {return this.phone;}public void setPhone(String phone) {this.phone = phone;}public Set<Orders> getOrderses() {return this.orderses;}public void setOrderses(Set<Orders> orderses) {this.orderses = orderses;}}Customer.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping><class name="com.PO.Customer" table="customer" catalog="onetomany"><id name="id" type="integer"><column name="ID" /><generator class="identity"></generator></id><property name="cname" column="CNAME" type="string"></property><property name="bank" column="BANK" type="string"> </property> <property name="phone" column="PHONE" type="string"> </property><!-- 一對多雙向映射customer到orders,單的一方配置 ,name是PO類Company的屬性,table是關聯表名,如果設置成inverse為true,以設定一方到多方的設定是逆向映射,即可以從多放引導到一方。一定要加lazy="false"否則會出現延遲加載錯誤--><set name="orderses" table="orders" inverse="true" lazy="false" cascade="all" ><key column="CUSTOMER_ID"/><!--外鍵字段: <key>標簽指定的外鍵字段必須和<many-to-one>指定的外鍵字段一致 --><one-to-many class="com.PO.Orders" /><!-- 用關聯表對應的PO類實例做value值 --></set></class> </hibernate-mapping> Orders.java
package com.PO;/*** Orders entity. @author tuke*/public class Orders implements java.io.Serializable {private Integer id; private String orderno;private double money;private Customer customer;//關聯customer/** default constructor */public Orders() {}/** full constructor */public Orders(Customer customer, String orderno, double money) {this.customer = customer;this.orderno = orderno;this.money = money;}// Property accessorspublic Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public Customer getCompany() {return this.customer;}public void setCompany(Customer customer) {this.customer = customer;}public String getOrderno() {return this.orderno;}public void setOrderno(String orderno) {this.orderno = orderno;}public double getMoney() {return this.money;}public void setMoney(double money) {this.money = money;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}}Orders.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping><class name="com.PO.Orders" table="orders" catalog="onetomany"><id name="id" type="integer"><column name="ID" /><generator class="identity"></generator></id><property name="orderno" column="ORDERNO" type="string"> </property><property name="money" column="MONEY" type="double"> </property><!-- 一對多雙向關聯映射中,多的一方配置manytoone ,name是PO屬性,一定要加lazy="false"否則會出現延遲加載錯誤--><many-to-one name="customer" column="CUSTOMER_ID" class="com.PO.Customer" lazy="false"></many-to-one></class> </hibernate-mapping> TestBean.java
package com.test;import java.util.Random;import com.PO.Customer; import com.PO.Orders; import com.dao.OneManyDao;public class TestBean {OneManyDao dao=new OneManyDao();Random rnd=new Random();public void addCustomer(){Customer customer=new Customer();customer.setCname("tuke");customer.setBank("中國銀行");customer.setPhone("027-12121221");//數據庫操作dao.addCustomer(customer);}public Customer loadCustomer(Integer id){return dao.loadCustomer(id);}//為客戶customer添加訂單orders,被控方操作public void addOrders(Customer customer){//隨機生成order對象Orders order=new Orders();order.setOrderno(new Integer(rnd.nextInt()*10000).toString());order.setMoney(new Double(rnd.nextDouble()*10000));order.setCustomer(customer);//如果映射文件正確,則orders表的CUSTOMER_ID字段會有customer的ID//把生成的order對象,加入customer的set集合中customer.getOrderses().add(order);System.out.println( customer.getOrderses().contains(order));dao.addOrders(order);}public Orders loadOrders(Integer id){return dao.loadOrders(id);} } OneManyDao.java
package com.dao;import org.hibernate.Session; import org.hibernate.Transaction;import SessionFactory.HibernateSessionFactory;import com.PO.Customer; import com.PO.Orders;/*** Data access object (DAO) for domain model* @author tuke*/ public class OneManyDao {//添加客戶信息public void addCustomer(Customer customer){Session session=HibernateSessionFactory.getSession();Transaction ts=null;try{ts=session.beginTransaction();//保存customer對象的同時,會保存其包含的所有訂單session.saveOrUpdate(customer);ts.commit();}catch(Exception ex){ts.rollback();System.out.println("添加客戶失敗!");}finally{HibernateSessionFactory.closeSession();}}//加載客戶信息public Customer loadCustomer(Integer id){Session session=HibernateSessionFactory.getSession();Transaction ts=null;Customer customer=null;try{ts=session.beginTransaction();//加載customer信息時,同樣會加載其所有的訂單信息customer=(Customer)session.get(Customer.class, id);ts.commit();}catch(Exception ex){ts.rollback();System.out.println("獲取客戶失敗!");}finally{HibernateSessionFactory.closeSession();}return customer;}//添加訂單信息public void addOrders(Orders order){Session session=HibernateSessionFactory.getSession();Transaction ts=null;try{ts=session.beginTransaction();session.save(order);ts.commit();}catch(Exception ex){ts.rollback();System.out.println("添加訂單失敗!");}finally{HibernateSessionFactory.closeSession();}}//加載訂單信息public Orders loadOrders(Integer id){Session session=HibernateSessionFactory.getSession();Transaction ts=null;Orders order=null;try{ts=session.beginTransaction();order=(Orders)session.get(Orders.class, id);ts.commit();}catch(Exception ex){ts.rollback();System.out.println("獲取訂單失敗!");}finally{HibernateSessionFactory.closeSession();}return order;}}測試頁面test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.PO.*" import="com.test.*" import="java.text.NumberFormat"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>hibernate的一對多雙向關聯關系映射</title><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body> <h2>hibernate的一對多雙向關聯關系映射</h2><hr><jsp:useBean id="test" class="com.test.TestBean"></jsp:useBean><%test.addCustomer();Integer id=new Integer(1);Customer customer=test.loadCustomer(id);//給該客戶增加三個訂單test.addOrders(customer);test.addOrders(customer);test.addOrders(customer);//根據指定的客戶,得到該客戶的所有訂單 NumberFormat nf=NumberFormat.getCurrencyInstance();out.println("<br>客戶"+customer.getCname()+"的所有訂單");Iterator<Orders> it=customer.getOrderses().iterator();Orders order=null;while(it.hasNext()){order=(Orders)it.next();System.out.println(order.getOrderno());out.println("<br>訂單號:"+order.getOrderno());out.println("<br>訂單金額:"+nf.format(order.getMoney()));}//根據指定的訂單,得到其所屬的客戶order=test.loadOrders(new Integer(28));customer=order.getCustomer();out.println("<br>");out.println("<br>訂單號為:"+order.getOrderno().trim()+"的所屬客戶為:"+customer.getCname());%></body> </html> 測試結果:
控制臺打印的sql語句是:
Hibernate: insert intoonetomany.customer(CNAME, BANK, PHONE) values(?, ?, ?) Hibernate: selectcustomer0_.ID as ID1_0_,customer0_.CNAME as CNAME1_0_,customer0_.BANK as BANK1_0_,customer0_.PHONE as PHONE1_0_ fromonetomany.customer customer0_ wherecustomer0_.ID=? //上面是save和load一個customer Hibernate: selectorderses0_.CUSTOMER_ID as CUSTOMER4_1_,orderses0_.ID as ID1_,orderses0_.ID as ID0_0_,orderses0_.ORDERNO as ORDERNO0_0_,orderses0_.MONEY as MONEY0_0_,orderses0_.CUSTOMER_ID as CUSTOMER4_0_0_ fromonetomany.orders orderses0_ whereorderses0_.CUSTOMER_ID=? true Hibernate: insert intoonetomany.orders(ORDERNO, MONEY, CUSTOMER_ID) values(?, ?, ?) true Hibernate: insert intoonetomany.orders(ORDERNO, MONEY, CUSTOMER_ID) values(?, ?, ?) true Hibernate: insert intoonetomany.orders(ORDERNO, MONEY, CUSTOMER_ID) values(?, ?, ?) //上面是給客戶添加三個訂單的sql 741563392 -1674530192 -635127520 //這是三個customer實例中set集合里的三個訂單號 Hibernate: selectorders0_.ID as ID0_0_,orders0_.ORDERNO as ORDERNO0_0_,orders0_.MONEY as MONEY0_0_,orders0_.CUSTOMER_ID as CUSTOMER4_0_0_ fromonetomany.orders orders0_ whereorders0_.ID=? Hibernate: selectcustomer0_.ID as ID1_0_,customer0_.CNAME as CNAME1_0_,customer0_.BANK as BANK1_0_,customer0_.PHONE as PHONE1_0_ fromonetomany.customer customer0_ wherecustomer0_.ID=? Hibernate: selectorderses0_.CUSTOMER_ID as CUSTOMER4_1_,orderses0_.ID as ID1_,orderses0_.ID as ID0_0_,orderses0_.ORDERNO as ORDERNO0_0_,orderses0_.MONEY as MONEY0_0_,orderses0_.CUSTOMER_ID as CUSTOMER4_0_0_ fromonetomany.orders orderses0_ whereorderses0_.CUSTOMER_ID=? 總結:
一對多雙向關聯映射:
* 在“一”一端的集合上使用<key>,<key>標簽指定的是外鍵字段,在對方表中加入一個外鍵指向一一端
* 在多一端采用<many-to-one>
注意:<key>標簽指定的外鍵字段必須和<many-to-one>指定的外鍵字段一致,否則引用字段的錯誤
關鍵配置代碼如下:
<!-- 一對多雙向映射customer到orders,單的一方配置 ,name是PO類Company的屬性,table是關聯表名,如果設置成inverse為true,以設定一方到多方的設定是逆向映射,即可以從多放引導到一方。一定要加lazy="false"否則會出現延遲加載錯誤--><set name="orderses" table="orders" inverse="true" lazy="false" cascade="all" ><key column="CUSTOMER_ID"/><!--外鍵字段: <key>標簽指定的外鍵字段必須和<many-to-one>指定的外鍵字段一致 --><one-to-many class="com.PO.Orders" /><!-- 用關聯表對應的PO類實例做value值 --></set> <!-- 一對多雙向關聯映射中,多的一方配置manytoone ,name是PO屬性,一定要加lazy="false"否則會出現延遲加載錯誤--><many-to-one name="customer" column="CUSTOMER_ID" class="com.PO.Customer" lazy="false"></many-to-one>
總結
以上是生活随笔為你收集整理的hibernate的一对多双向关联映射----客户和订单关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlserver2005表转到mysq
- 下一篇: hibernate继承关系映射方法(一)