前言:在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程序中的对象,数据库中的表,这两者在设计中往往存在不同步状况,建好一个项目中的模显得尤为重要。