我正在使用Hibernate 3.3.1,並且正沿着建模this sample table structure的方向發展,但我在創建具有額外屬性的連接表時遇到問題。JPA ManyToMany Join Table具有所有屬性PK
這是Order
和Product
表之間的多對多關係。連接表是Order Detail
表。我遵循了here提到的方法。
現在我有實體
@Entity
@Table(name = "Orders")
public class Order {
@OneToMany(mappedBy="order")
private List<OrderDetail> orderItems;
}
和
@Entity
@Table(name="PRODUCTS")
public class Product {
@OneToMany(mappedBy="product")
private List<OrderDetail> orderItems;
}
和
@Entity
@IdClass(OrderDetail.class)
@Table(name = "ORDER_DETAIL")
public class OrderDetail implements Serializable {
@Id
@Column(name="ORDER_ID")
private Long orderId;
@Id
@Column(name="PRODUCT_ID")
private Long productId;
@Column(name = "PRICE")
private double price;
@Column(name = "LAST_UPDATED_TIME")
private Date lastUpdatedTime;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
和
public class OrderDetailId implements Serializable {
private Long orderId;
private Long productId;
}
我使用Apache Derby來做測試,但是我遇到了生成的表結構的問題。
CREATE TABLE ORDER_DETAIL (
PRODUCT_ID BIGINT NOT NULL,
ORDER_ID BIGINT NOT NULL,
LAST_UPDATED_TIME TIMESTAMP NOT NULL,
PRICE DOUBLE NOT NULL
);
CREATE INDEX SQL120323142938020 ON ORDER_DETAIL (PRODUCT_ID ASC);
CREATE UNIQUE INDEX SQL120323142937810 ON ORDER_DETAIL (PRODUCT_ID ASC, ORDER_ID ASC, LAST_UPDATED_TIME ASC, PRICE ASC);
ALTER TABLE ORDER_DETAIL ADD CONSTRAINT SQL120323142937810 PRIMARY KEY (PRODUCT_ID, ORDER_ID, LAST_UPDATED_TIME, PRICE);
ALTER TABLE ORDER_DETAIL ADD CONSTRAINT FK4A94AA82CC6D989A FOREIGN KEY (PRODUCT_ID)
REFERENCES PRODUCTS (PROD_ID);
看來它已經創建了我所有的列作爲主鍵。這是爲什麼?
嗨Mikko,Ahh只是一個想法,因爲我仍然是JPA的初學者。我開始認爲@ManyToMany註釋似乎更像是一個細微差別,當你可以手動完成時?你不覺得嗎?我的理解有點淺,但那是我的印象。 – 2012-03-23 08:21:14
在所有情況下,我都可以認爲正確的知道,可以在沒有ManyToMany的情況下進行映射。當關系的性質要求時,我總是傾向於使用多對多的方式,因爲它更乾淨並且代碼更少。 – 2012-03-25 14:08:07