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