Spring hibernate映射主键和复合键之间的一对多关系
我正在努力解决hibernate映射问题,即在订单表的主键和带有一些额外列的产品购物车的复合键之间映射一对多关系Spring hibernate映射主键和复合键之间的一对多关系,spring,spring-mvc,hibernate-mapping,hibernate-onetomany,Spring,Spring Mvc,Hibernate Mapping,Hibernate Onetomany,我正在努力解决hibernate映射问题,即在订单表的主键和带有一些额外列的产品购物车的复合键之间映射一对多关系 public class OrderDetails implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @Column(name="ORDERID") @GeneratedValue(strategy=GenerationType.IDENTITY)
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
.....
.....
产品购物车表具有组合键购物车ID和产品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:非法尝试使用mappedBy关联定义@JoinColumn:pcoPK.pk
位于org.hibernate.cfg.Ejb3JoinColumn.buildJoinColumnEjb3JoinColumn.java:152
在org.hibernate.cfg.Ejb3JoinColumn.buildJoinColumnsEjb3JoinColumn.java:127
位于org.hibernate.cfg.AnnotationBinder.ProcessElementAnnotationsAnotationBinder.java:1212
位于org.hibernate.cfg.AnnotationBinder.fillComponentAnnotationBinder.java:1841
在org.hibernate.cfg.AnnotationBinder.bindidanotationbinder.java:1878经过大量研究,我找不到解决方案,我用另一种方法完成了。 我在OrderDetails和Product之间创建了多对多关系,为Product cart中的每个元素手动创建了一些额外的列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);
}