I am struggling with a hibernate mapping problem of mapping One to many relation ship between Primary key of Order Table and composite key of Product Cart with some extra columns
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
.....
.....
Product Cart table has a composite key CART ID and 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
.....
.....
I tried following but not working
@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);
}
Can someone please help me to implement this? Below is the error message
Caused by: org.hibernate.AnnotationException: Illegal attempt to define a @JoinColumn with a mappedBy association: pcoPK.pk at org.hibernate.cfg.Ejb3JoinColumn.buildJoinColumn(Ejb3JoinColumn.java:152) at org.hibernate.cfg.Ejb3JoinColumn.buildJoinColumns(Ejb3JoinColumn.java:127) at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1212) at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:1841) at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1878)
After lot of research I could not find the solution I done it in another way. I created Many to many relationship between OrderDetails and Product with some extra columns ID, price, quantity and inserted value manually for each element in product cart thorugh a for loop.
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
}
In my controller class where I wanted to save the products of ProductCart I did following
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);
}