如何表示地图 使用JPA的关系?

问题描述 投票:0回答:2

我有一个Order实体和一个Product实体。订单可以有多个对,代表产品和销售数量。 JPA代表它的合适关系是什么?

(到目前为止,我只找到了将EntityA集合与EntityB相关联的方法。例如,EntityA包含List<EntityB>。)

java spring hibernate jpa
2个回答
1
投票

如果数量全部存在于此关联,并且您不需要从ProductOrder导航,您可以将Integer quantity视为元素集合并执行以下操作 - Product保持不变:

public class Order {
    @ElementCollection                          // 1
    @CollectionTable(name="ORDER_PRODUCT_QTY")  // 2
    @MapKeyJoinColumn(name="PRODUCT_ID")        // 3
    @Column(name="QUANTITY")                    // 4
    private Map<Product, Integer> quantities;
}
  1. 它是由实体键入的基本类型(数量的整数)的集合
  2. 它是多值的,因此需要一个单独的表格;您可以选择指定其名称
  3. 单独的集合表将包含指向Order实体的列,指向Product的列和数值本身的列。这允许您设置引用Product表的FK的名称,并且是可选的。
  4. 这允许您指定包含数量值的列的名称。也可选。

如果您有理由相信这还不够,那么您可能想要创建一个代表该关联的独特实体,例如:

←→Order OrderItem Product

Order有许多OrderItems,Product有许多OrderItems,Order有许多Products间接通过OrderItemProduct可以在许多Orders中找到,间接通过OrderItem,数量在OrderItem。将这种“与价值的关系”表示为一个实体比收集映射更灵活。


0
投票

你必须映射实体

在Order.java中

 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "order_Id")
    @JsonBackReference
    private List<Product> product = new ArrayList<Product>();

在Product.jave中

@ManyToOne
    @JoinColumn(name = "product_Id", referencedColumnName = "product_Id", nullable = false, insertable = false, updatable = false)
    @JsonBackReference
    private Order order;
© www.soinside.com 2019 - 2024. All rights reserved.