Hibernate配置多个外键做联合主键

项目中的vipInfo--cart---cartItem 三个表之间的关系如下

vipInfo与cart的关系是一对一

所以将它俩的关联表中的主键放在谁那都行。

博主为了逻辑上的清晰,我将cart的cartId作为竟为cart表的主键,有为vipId外键,存在vipId的外键约束。

因为每个用户都有一个购物车,但是购物车与购物车内的商品关系是m:n,所以这时候需要新建一个联系表cartItem(cartId,goodsId)

现在这三个表之间的关系描述完毕:

(vipInfo表没有什么不同,主要就是cart表和cartItem表)

vipInfo.java

public class VipInfo {
    private int vipId;     //会员id
    private String vipNickName;//会员昵称
    private String vipPassWord; //会员密码
    private String vipEmail;
    private String vipActiCode;
    private int vipStatus;
//    @JSONField(format="yyyy/MM/dd HH:mm:ss")
    private Date vipTokenTime;
    
           
             
                                    
                  
             
               
               
               
               
               
               
               
             
           
    
    

VipInfo.hbm.xml

    
           
             
                                    
                  
             
               
               
               
               
               
                          
           
    
    

Cart.java

public class Cart {
	
	private int cartId;//购物车id
	private int cartNum; //购物车总数
	private float cartPrice;//购物车总价
	private VipInfo vipId;
	
	

Cart.hbm.xml

    
    
           
             
                  
                    vipId
                  
             
               
                             
            
            
    

联合外键做主键需要我们新建一个联合外键的java类!(仔细看代码哦现在,我们需要重写其的equals()方法和hashCode()方法)

CartItemPk.java

package com.entity;

import java.io.Serializable;

public class CartItemPk implements Serializable{
	
	private int cartId; //购物车id
    private int goodsId; //商品id
    
	
	public int getCartId() {
		return cartId;
	}
	public void setCartId(int cartId) {
		this.cartId = cartId;
	}
	public int getGoodsId() {
		return goodsId;
	}
	public void setGoodsId(int goodsId) {
		this.goodsId = goodsId;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + cartId;
		result = prime * result + goodsId;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CartItemPk other = (CartItemPk) obj;
		if (cartId != other.cartId)
			return false;
		if (goodsId != other.goodsId)
			return false;
		return true;
	}
    
    

}

CartItem.java

public class CartItem {

	  private Cart cartId; //购物车id
	  private Goods goodsId; //商品id
	  CartItemPk cartItemPk = new CartItemPk();
	  	  	  

CartItem.hbm.xml

    
           
               
               
                  
                  
               
               
              
               
                    
               
               
               
                    
               
                      
              
           
    
    

下面贴下数据库中的表

vipinfo表

Hibernate配置多个外键做联合主键_第1张图片

cart表

Hibernate配置多个外键做联合主键_第2张图片

cartItem表

仔细看会发现vipinfo表中没有cartId,cart表中也没有vipId

但是在操作数据库中会发现,cart表中的cartId受vipinfo表中vipId约束。

并且在向cartItem表中插入数据是,我们应该是将int类型的cartId和goodsId封装成cartItemPk

然后将cartItemPk再封装给cartItem。

service层:

//加购物车
	public void insertCartItem(int cartId, int goodsId) {
		CartItemPk cartItemPk = new CartItemPk(cartId,goodsId);
		CartItem cartItem = new CartItem();
		cartItem.setCartItemPk(cartItemPk);
		baseDao.save(cartItem);
	}

测试层:

    @Test
      public void testCartInsertService() {
         CartItemService service;        
         service=(CartItemService)ac.getBean("cartItemService");
         //cartid 和 goodId
         service.insertCartItem(34, 17);
      }



你可能感兴趣的:(个人项目经验)