015_數據建模時,JavaBean的實體類中怎樣處理外鍵


數據庫中的表在映射為JavaBean的實體類時,實體類的字段名應與數據庫表中的字段名一致。那么外鍵要怎么處理?

1. JavaBean中實體類中不應該出現外鍵字段,弊端如下 : 

  1. 如果出現外鍵對應的字段,那么將會出現一個對象與另一個對象的屬性相對應,這將不是面向對象中的對象與對象對應。
  2. 單個外鍵只能存儲一個字符串,用處不大

2.外鍵處理方式 :數據庫表中的外鍵字段應當轉換成外鍵對應的表的對象,也就是JavaBean的實體類不聲明外鍵的字段,而是聲明外鍵對應數據表類的類型。舉個例子,如下 :

  數據庫建表如下 : 

-- 1.1 創建用戶表
CREATE TABLE `user` (
  `uid` varchar(32) NOT NULL,  #用戶編號
  `username` varchar(20) DEFAULT NULL,		#用戶名
  `password` varchar(20) DEFAULT NULL,		#密碼
  `name` varchar(20) DEFAULT NULL,			#昵稱
  `email` varchar(30) DEFAULT NULL,			#電子郵箱
  `telephone` varchar(20) DEFAULT NULL,		#電話
  `birthday` date DEFAULT NULL,				#生日
  `sex` varchar(10) DEFAULT NULL,			#性別
  `state` int(11) DEFAULT 0,				#狀態:0=未激活,1=已激活
  `code` varchar(64) DEFAULT NULL,			#激活碼
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB ;

-- 2.1 創建分類表
CREATE TABLE `category` (
  `cid` varchar(32) NOT NULL,
  `cname` varchar(20) DEFAULT NULL,	#分類名稱
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB ;

-- 3.1 創建商品表
CREATE TABLE `product` (
  `pid` varchar(32) NOT NULL,
  `pname` varchar(50) DEFAULT NULL,		#商品名稱
  `market_price` double DEFAULT NULL,	#市場價
  `shop_price` double DEFAULT NULL,		#商城價
  `pimage` varchar(200) DEFAULT NULL,	#商品圖片路徑
  `pdate` date DEFAULT NULL,			#上架時間
  `is_hot` int(11) DEFAULT NULL,		#是否熱門:0=不熱門,1=熱門
  `pdesc` varchar(255) DEFAULT NULL,	#商品描述
  `pflag` int(11) DEFAULT 0,			#商品標記:0=未下架(默認值),1=已經下架
  `cid` varchar(32) DEFAULT NULL,		#分類id
  PRIMARY KEY (`pid`),
  KEY `product_fk_0001` (`cid`),
  CONSTRAINT `product_fk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
)  ENGINE=InnoDB ;

-- 4 創建訂單表
CREATE TABLE `order` (
  `oid` varchar(32) NOT NULL,
  `ordertime` datetime DEFAULT NULL,		#下單時間
  `total` double DEFAULT NULL,				#總價
  `state` int(11) DEFAULT NULL,				#訂單狀態:1=未付款;2=已付款,未發貨;3=已發貨,沒收貨;4=收貨,訂單結束
  `address` varchar(30) DEFAULT NULL,		#收獲地址
  `name` varchar(20) DEFAULT NULL,			#收獲人
  `telephone` varchar(20) DEFAULT NULL,		#收貨人電話
  `uid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`oid`),
  KEY `order_fk_0001` (`uid`),
  CONSTRAINT `order_fk_0001` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
)  ENGINE=InnoDB ;

-- 5 創建訂單項表
CREATE TABLE `orderitem` (
  `itemid` varchar(32) NOT NULL,
  `quantity` int(11) DEFAULT NULL,			#購買數量
  `total` double DEFAULT NULL,			#小計
  `pid` varchar(32) DEFAULT NULL,		#購買商品的id
  `oid` varchar(32) DEFAULT NULL,		#訂單項所在訂單id
  PRIMARY KEY (`itemid`),
  KEY `order_item_fk_0001` (`pid`),
  KEY `order_item_fk_0002` (`oid`),
  CONSTRAINT `order_item_fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`),
  CONSTRAINT `order_item_fk_0002` FOREIGN KEY (`oid`) REFERENCES `order` (`oid`)
)  ENGINE=InnoDB ;

  其中訂單與訂單項的JavaBean的實體類如下 : 

/**
 * 訂單項
 */
public class OrderItem {

	private String itemid ;		//	訂單項編號
	private Integer quantity;		//	購買數量
	private Double total;	//	小計

	private Product product ;	//	商品對象
	private Order order ;		//	訂單項所在訂單對象
	......
}

/**
 * 	訂單實體類
 */
public class Order {
	
	private String oid ;		//	訂單編號
	private Date ordertime;	//	下單時間
	private Double total ;		//	總價
	private Integer state ;		//	訂單狀態 :  1 : 未付款  2 : 已付款,未發貨   3 :已發貨,未收貨    4: 已收貨,訂單結束
	private String address ;	//	收貨地址
	private String name ;		//	收件人姓名 : 收件人不一定是購買人
	private String telephone ;	//	收件人電話

	private User user ;			//	訂單所屬的用戶
	
	private List<OrderItem> list = new ArrayList<>() ;	//	訂單項集合
	......
}

  這樣做的優點如下 : 

  1. 程序對象和對象產生關系,而不是對象(Order的對象)和對象的屬性(User對象的uid)產生關系
  2. 設計Order的目的 : 讓order攜帶訂單上的數據向service層,dao層傳遞,user對象是可以攜帶更多的數據的
  3. 程序中體現訂單對象和訂單項對象之間的關系,項目中的部分功能中有類似的需求 : 查詢訂單的同時,還要獲取訂單下所有的訂單項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM