如何使用 JPA 表示映射<实体类型、整数>关系?



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

(到目前为止,我只找到了将实体A集合与实体B相关联的方法,例如实体A包含一个List<EntityB>

如果数量是此关联的全部内容,并且您不需要从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. 这使您可以指定保存数量值的列的名称。也是可选的。

如果您有理由认为这还不够,那么您可能需要创建一个代表关联的不同实体,例如:

OrderOrderItemProduct

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

你必须像这样映射实体

In Order.jave

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

在产品中

@ManyToOne
@JoinColumn(name = "product_Id", referencedColumnName = "product_Id", nullable = false, insertable = false, updatable = false)
@JsonBackReference
private Order order;

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

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

最新更新