hibernate 外键做联合主键

使用Hibernate的外键作为联合主键:

如:有三张表

product:其字段有 id,proColor,proName。id是主键

orders:字段有 id,amount,date。id是主键

order_details:字段有 proId,orderId,quantity,price。proId和orderId为联合主键,并且proId是product表的外键,orderId是orders表的外键

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `proColor` varchar(255) DEFAULT NULL,
  `proName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

CREATE TABLE `orders` (
  `id` int(11) NOT NULL,
  `amount` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)



CREATE TABLE `order_details` (
  `price` double DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `orderId` int(11) NOT NULL DEFAULT '0',
  `proId` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`orderId`,`proId`),
  CONSTRAINT `FK_q2kymfpksk4xk8etdur1cv3kj` FOREIGN KEY (`proId`) REFERENCES `product` (`id`),
  CONSTRAINT `FK_msk76lwy2lb5nj4w78nfjhye6` FOREIGN KEY (`orderId`) REFERENCES `orders` (`id`)
)

 一: 使用@onetoone注解

使用hibernate配置:

1、product实体:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Product {
	private Integer id;
	private String proName;
	private String proColor;
	
	@Id
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	public String getProColor() {
		return proColor;
	}
	public void setProColor(String proColor) {
		this.proColor = proColor;
	}
	
}

  

2、orders实体:

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Orders {
	private Integer Id;
	private Integer amount;
	private Date date;
	@Id
	public Integer getId() {
		return Id;
	}
	public void setId(Integer id) {
		Id = id;
	}
	public Integer getAmount() {
		return amount;
	}
	public void setAmount(Integer amount) {
		this.amount = amount;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}

3、order_details实体:

import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class Order_Details {
	private Order_Pro_PK id;
	private Integer quantity;
	private Double price;
	
	@Id
	public Order_Pro_PK getId() {
		return id;
	}
	public void setId(Order_Pro_PK id) {
		this.id = id;
	}
	public Integer getQuantity() {
		return quantity;
	}
	public void setQuantity(Integer quantity) {
		this.quantity = quantity;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	
	
	
}

4、因为在order_details表中的id,是联合主键,所以有了:

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Embeddable  
public class Order_Pro_PK implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private Product product ;
	private Orders order ;
	
	@OneToOne
	@JoinColumn(name="orderId")
	public Orders getOrder() {
		return order;
	}
	public void setOrder(Orders order) {
		this.order = order;
	}
	
	@OneToOne
	@JoinColumn(name="proId")
	public Product getProduct() {
		return product;
	}
	public void setProduct(Product product) {
		this.product = product;
	}
	
	@Override
	public int hashCode() {
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Order_Pro_PK){
			Order_Pro_PK cpk = (Order_Pro_PK) obj;
			if(cpk.getOrder().equals(this.getOrder()) && cpk.getProduct().equals(this.getProduct()) ){
				return true;
			}
		}
		return false;
	}
	
	
	
}

二、使用@manytoone注解

1、order实体

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Orders {
	private Integer Id;
	private Integer amount;
	private Date date;
	@Id
	public Integer getId() {
		return Id;
	}
	public void setId(Integer id) {
		Id = id;
	}
	public Integer getAmount() {
		return amount;
	}
	public void setAmount(Integer amount) {
		this.amount = amount;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	
	
	
}

2、product实体

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Product {
	private Integer id;
	private String proName;
	private String proColor;
	
	@Id
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	public String getProColor() {
		return proColor;
	}
	public void setProColor(String proColor) {
		this.proColor = proColor;
	}
	
	
}

  

3、order_details实体

import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class Order_Details {
	private Order_Pro_PK id;
	private Integer quantity;
	private Double price;
	
	@Id
	public Order_Pro_PK getId() {
		return id;
	}
	public void setId(Order_Pro_PK id) {
		this.id = id;
	}
	public Integer getQuantity() {
		return quantity;
	}
	public void setQuantity(Integer quantity) {
		this.quantity = quantity;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	
	
	
}

4、联合主键

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Embeddable  
public class Order_Pro_PK implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private Product product ;
	private Orders order ;
	
	@ManyToOne
	@JoinColumn(name="orderId")
	public Orders getOrder() {
		return order;
	}
	public void setOrder(Orders order) {
		this.order = order;
	}
	
	@ManyToOne
	@JoinColumn(name="proId")
	public Product getProduct() {
		return product;
	}
	public void setProduct(Product product) {
		this.product = product;
	}
	
	@Override
	public int hashCode() {
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Order_Pro_PK){
			Order_Pro_PK cpk = (Order_Pro_PK) obj;
			if(cpk.getOrder().equals(this.getOrder()) && cpk.getProduct().equals(this.getProduct()) ){
				return true;
			}
		}
		return false;
	}
	
	
	
}

其中在Order_Pro_PK类要重写equals和hashCode方法 

猜你喜欢

转载自1960370817.iteye.com/blog/2370377
今日推荐