使用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方法