這裏的DB模式如何在JPA中實現複雜的多對多關係?
CREATE TABLE Products
(
id INT NOT NULL AUTO_INCREMENT,
category_id INT NOT NULL,
description VARCHAR(100),
price DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (category_id) REFERENCES Categories(id)
) ENGINE = INNODB;
CREATE TABLE Orders
(
id INT NOT NULL AUTO_INCREMENT,
customer_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES Customers(id)
) ENGINE = INNODB;
CREATE TABLE OrderDetails
(
product_id INT NOT NULL,
order_id INT NOT NULL,
quantity INT NOT NULL,
subtotal DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (product_id, order_id),
FOREIGN KEY (product_id) REFERENCES Products(id),
FOREIGN KEY (order_id) REFERENCES Orders(id)
) ENGINE = INNODB;
該機型
@Embeddable
public class OrderDetailPK
{
private Product product;
private Order order;
public OrderDetailPK() {}
public OrderDetailPK(Product product, Order order)
{
this.product = product;
this.order = order;
}
}
public class OrderDetail {
@EmbeddedId
private OrderDetailPK id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="product_id", insertable=false, updatable=false)
private Product product;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="order_id", insertable=false, updatable=false)
private Order order;
private int quantity;
private double subtotal;
public OrderDetail() {}
public OrderDetail(OrderDetailPK id, int quantity, double subtotal)
{
this.product = id.getProduct();
this.order = id.getOrder();
this.quantity = quantity;
this.subtotal = subtotal;
}
// getters, setters
}
public class Product {
@Id
private int id;
private String description;
private double price;
@ManyToOne
@JoinColumn(name="category_id")
private Category category;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Products")
private List<OrderDetail> orderDetail;
}
public class Order {
@Id
private int id;
@ManyToOne
@JoinColumn(name="customer_id")
private Customer customer;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Orders")
private List<OrderDetail> orderDetail;
}
而對於一些原因,我不斷收到錯誤
Concrete type "class models.OrderDetail" with application identity does not declare any primary key fields.
任何人都可以指出我哪裏出了問題?謝謝
你爲什麼不乾脆用一個技術性,非複合主OrderDetail的關鍵,就像其他實體一樣。事情會非常簡單(和高效)。 – 2013-02-28 08:27:52
@JBNizet:在某些方面更簡單,而不是其他方面。你爲什麼認爲它會更有效率? – 2013-02-28 08:42:06
因爲數據庫上的數據庫索引比兩個索引更有效。但重點是簡單。在應用程序的每個級別使用單個值來識別訂單詳細信息將比使用兩個簡單得多。 – 2013-02-28 09:03:46