当前位置: 首页 > 知识库问答 >
问题:

hibernate映射主键和复合键之间的一对多关系

周翼
2023-03-14

我正在努力解决hibernate映射问题,即在订单表的主键和带有一些额外列的产品购物车的复合键之间映射一对多关系

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);
}

有人能帮我实现这一点吗?下面是错误消息

原因:组织。冬眠AnnotationException:非法尝试使用mappedBy关联pcoPK定义@JoinColumn。组织pk。冬眠cfg公司。Ejb3JoinColumn。在org上构建JoinColumn(Ejb3JoinColumn.java:152)。冬眠cfg公司。Ejb3JoinColumn。在org上构建JoinColumns(Ejb3JoinColumn.java:127)。冬眠cfg公司。AnnotationBinder。processElementAnnotations(AnnotationBinder.java:1212)位于org。冬眠cfg公司。AnnotationBinder。位于org的fillComponent(AnnotationBinder.java:1841)。冬眠cfg公司。AnnotationBinder。bindId(AnnotationBinder.java:1878)

共有1个答案

娄嘉石
2023-03-14

经过大量的研究,我找不到解决方案,我用另一种方式做到了这一点。我在订单详细信息和产品之间创建了多对多的关系,并为产品购物车中的每个元素手动创建了一些额外的列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产品的controller类中,我执行了以下操作

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);
        }
 类似资料:
  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi

  • 我有两个表:A和B,都有一个复合主键。表B的PK也是表a主键的外键。 当我试图获取映射表B的类的实例时,我得到了以下异常: org.hibernate.TypeMismatchException 这两个类都位于package:com.cairone.ejemple01.entities 完整的日志输出为: 2016-09-21 12:28:24.505错误8568--[main] O.S.Boot

  • 在child_tableparent_id列作为外键和复合主键的一部分。 Embedded类内部无法使用标识生成器。所以我在这里使用ID类。为child_id列生成自动增量值。 我无法将parent_table生成parent_id值作为外键值存储在child_table中,它存储为0。 有人能检查一下地图吗?帮帮我…… 提前致谢...

  • 它应该允许独立地更新表,并在父行被删除时删除子行。

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?