zoukankan      html  css  js  c++  java
  • 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. 程序中体现订单对象和订单项对象之间的关系,项目中的部分功能中有类似的需求 : 查询订单的同时,还要获取订单下所有的订单项
  • 相关阅读:
    推荐阅读20100603
    [ASP.NET4之旅]Circular file references are not allowed
    满园尽是503,记曾经的一次IIS 7性能考验
    VS2010小Bug:找不到System.Web.Extensions.dll引用
    VS2010奇异Bug:三个中文符号在CSS文件中轻松让VS2010崩溃
    推荐阅读20100528
    Windows平台网站文件同步备份解决方案——cwRsyn
    推荐阅读20100803
    在IE8中使用建行企业网银的解决方法
    博客园已经用上NorthScale Memcached Server
  • 原文地址:https://www.cnblogs.com/xddx/p/13382863.html
Copyright © 2011-2022 走看看