![](/img/trans.png)
[英]Hibernate one to many mapping where one class has a composite primary key on many side
[英]hibernate Mapping One to many relation ship between primary key and composite key
我正在解決一個休眠映射問題,即在“訂單表”主鍵和“產品購物車”的復合鍵與一些額外的列之間映射一對多關系
public class OrderDetails implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@Column(name="ORDERID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer orderId;
@Column(name="ORDER_DATE")
private Date orderDate= new Date();
//other fields and getter setter
.....
.....
產品購物車表具有復合鍵CART ID和PRODUCT ID
@Entity
@Table(name="PRODUCT_CART")
@AssociationOverrides({
@AssociationOverride(name="pk.shopCart", joinColumns=@JoinColumn(name="CARTID")),
@AssociationOverride(name="pk.product", joinColumns=@JoinColumn(name="PRODUCTID"))
})
public class ProductCart implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EmbeddedId
private ProductCartId pk = new ProductCartId();
@Column(name="QUANTITY")
private Integer selectedQuantity=1;
@Column(name="TOTAL")
private double total=0.0;
//other fields and getter setter
.....
.....
我嘗試追蹤但未運作
@Entity
@Table(name="PRODUCTCART_ORDERDETAILS")
@AssociationOverrides({
@AssociationOverride(name="pcoPK.orderDetails",joinColumns=@JoinColumn(name="ORDERID")) ,
@AssociationOverride(name="pcoPK.pk", joinColumns=
{@JoinColumn(name="pk.shopCart",referencedColumnName="CARTID"),
@JoinColumn(name="pk.product",referencedColumnName="PRODUCTID") }) })
public class ProductCartOrder implements Serializable {
/**
*
*/
private static final long serialVersionUID = -2348674131019001487L;
@EmbeddedId
private ProductCartOrderId pcoPK = new ProductCartOrderId();
@Column(name="QUANTITY")
private Integer quantity;
@Column(name="PRICE")
private double price;
@Transient
public OrderDetails getOrderDetails(){
return getPcoPK().getOrderDetails();
}
public void setOrderDetails(OrderDetails orderDetails){
getPcoPK().setOrderDetails(orderDetails);
}
@Transient
public ProductCartId getProductCartId(){
return getPcoPK().getPk();
}
public void setProductCartId(ProductCartId pk){
getPcoPK().setPk(pk);
}
有人可以幫我實現這個嗎? 下面是錯誤信息
由以下原因引起:org.hibernate.AnnotationException:非法嘗試定義一個帶有mappingBy關聯的@JoinColumn:org.hibernate.cfg.Ejb3JoinColumn處org.hibernate.cfg.Ejb3JoinColumn.buildJoinColumn(Ejb3JoinColumn.java:152)的pcoPK.pk。在org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1212)在org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:1841)上的org.hibernate.cfg.buildJoinColumns(Ejb3JoinColumn.java:127) .bindId(AnnotationBinder.java:1878)
經過大量的研究,我找不到解決方案,而我用另一種方式做到了。 我為產品購物車中的每個元素手動創建了OrderDetails和Product之間的多對多關系,並為其添加了一些額外的列ID,價格,數量和插入值,請參見for循環。
public class Product implements Serializable {
@OneToMany(mappedBy="product")
private Set<ProductOrder> productOrder;
...//other fields and getter setter
}
public class OrderDetails implements Serializable {
@OneToMany(mappedBy="orderDetails")
private Set<ProductOrder> productOrder;
...//other fields and getter setter
}
public class ProductOrder {
@Id
@Column(name="PRODUCT_ORDER_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int prductOrderId;
@ManyToOne
private OrderDetails orderDetails;
@ManyToOne
private Product product;
...//other fields and getter setter
}
在我想保存ProductCart產品的控制器類中,我做了以下工作
List<ProductCart> productList = new ArrayList<ProductCart>();
productList=productCartService.getCartProducts(shopCart);
ProductOrder orderedProducts = new ProductOrder();
for (ProductCart productCarts : productList) {
orderedProducts.setOrderDetails(orderDetails);
orderedProducts.setProduct(productCarts.getPk().getProduct());
orderedProducts.setPrice(productCarts.getPk().getProduct().getPrice());
orderedProducts.setQuantity(productCarts.getSelectedQuantity());
productOrderService.addOrderProducts(orderedProducts);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.