前言:在java的世界中萬事萬物皆對象,而在一個工程中往往是涉及到多個對象。那么在處理多個對象之間的關系顯得尤為重要,對象關系大致可以分為四種。一對一、一對多、多對一、多對多,而一對一無需多講,一對多與多對一則是考慮的角度問題,其本質都是一樣的,最后多對多也是可以拆分為一對多的關系。本例講解一個訂單與訂單明細的例子便屬於一個典型的一對多關系。
需求:本例需要做一個飯館管理客戶小型的點餐系統,主要是管理客戶訂單。
誤區:對於面向對象編程語言的初學者來說建模時可能會定義一個訂單對象包含訂單編號,訂單日期,訂單人數,所定菜名,份數,價格等屬性的一個對象。
正解:此處應分為兩個對象,一個訂單對象(訂單號,人數,日期,等)一個訂單明細對象(所定菜名,份數,價格等)。因為一個對象與屬性的關系應該是十分緊密的,比如說菜的價格是與菜關聯的並沒有與訂單存在直接關系。一個客戶(訂單對象)可能會點多個菜(訂單明細對象),這便是我們問題的引入點。
一對多配置方式一、使用jpa注解
首先看一下我們one端,也就是訂單對象端部分代碼
1 import java.util.Date; 2 import java.util.HashSet; 3 import java.util.Set; 4 5 import javax.persistence.CascadeType; 6 import javax.persistence.Column; 7 import javax.persistence.Entity; 8 import javax.persistence.FetchType; 9 import javax.persistence.GeneratedValue; 10 import javax.persistence.GenerationType; 11 import javax.persistence.Id; 12 import javax.persistence.OneToMany; 13 import javax.persistence.Table; 14 15 @Entity 16 @Table(name = "t_order") 17 public class Order { 18 19 @Id 20 @GeneratedValue(strategy=GenerationType.IDENTITY) 21 private Integer id;// 主鍵 22 @Column(name="p_Count",nullable=false) 23 private Integer pCount;// 人數 24 @Column(name="pub_Date",nullable=false) 25 private Date pubDate;//日期 26 27 private Set<OrderItem> orderItems = new HashSet<OrderItem>(); 28 29 @OneToMany(mappedBy="order",cascade={CascadeType.ALL},fetch=FetchType.EAGER) 30 public Set<OrderItem> getOrderItems() { 31 return orderItems; 32 }
接下是我們的 many端
1 @Entity 2 @Table(name = "t_order_item") 3 public class OrderItem { 4 5 @Id 6 @GeneratedValue(strategy=GenerationType.IDENTITY) 7 private Integer id;//主鍵 8 @Column(name="detail_desc",nullable=false,length=50) 9 private String detailDesc;//菜名 10 @Column(name="price",nullable=false) 11 private Integer price;//單價 12 @Column(name="c_count",nullable=false) 13 private Integer cCount;//數量 14 15 private Order order; 16 17 @ManyToOne(cascade={CascadeType.REMOVE},optional=true,fetch=FetchType.EAGER) 18 @JoinColumn(name="orderid")
解析:hibernate主要通過onetomany和manytoone這兩個注解建立起訂單表與訂單明細表的主外鍵引用關系。主表對象通過定義set集合存放從表對象,從表定義一個屬性為主表對象,從而使兩個對象關聯起來。
一對多配置方式二、使用xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping package="order"> 7 <class name="order.entity.Order" table="t_order"> 8 <id name="id" type="long" column="ID"> 9 <generator class="native"></generator> 10 </id> 11 <property name="pCount" type="string"> 12 <column name="p_Count" length="15"></column> 13 </property> 14 <set name="orders" cascade="save-update" lazy="false"> 15 <key column="orderItem_ID"></key> 16 <one-to-many class="order.entity.OrderItem"/> 17 </set> 18 </class> 19 </hibernate-mapping>
1 <hibernate-mapping package="order"> 2 <class name="order.entity.OrderItem" table="t_orderItem"> 3 <id name="id" type="long" column="orderItem_ID"> 4 <generator class="increment"></generator> 5 </id> 6 ... 7 <many-to-one name="customer" column="CUSTOMER_ID" class="order.entity.Order"/> 8 </class> 9 </hibernate-mapping>
總結:java程序中的對象,數據庫中的表,這兩者在設計中往往存在不同步狀況,建好一個項目中的模顯得尤為重要。