如何使用JPA表示Map <entitytype,integer =“”>关系?

时间:2018-01-03 04:29:59

标签: java spring hibernate jpa

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

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

3 个答案:

答案 0 :(得分: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. 这使您可以指定包含数量值的列的名称。也可选。
  5. 如果您有理由相信这还不够,那么您可能想要创建一个代表该关联的独特实体,例如:

    OrderOrderItemProduct

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

答案 1 :(得分:0)

你必须映射像

这样的实体

在Order.jave中

 @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;

答案 2 :(得分:0)

我也在使用上面的代码,但是对我来说不起作用。 下面是我的代码。

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="content_package_component_level_languages_language_assessment_map", joinColumns=@JoinColumn(name="id"))
@MapKeyJoinColumn(name="language_assessment_map_key", referencedColumnName = "id")
@Column(name="language_assessment_map")
private Map<Lang, Integer> languageAssessmentMap;