我有一个Order
实体和一个Product
实体。一个订单可以有多个对,代表产品和销售数量。JPA 中表示它的适当关系是什么?
(到目前为止,我只找到了将实体A集合与实体B相关联的方法,例如实体A包含一个List<EntityB>
。
如果数量是此关联的全部内容,并且您不需要从Product
→Order
导航,则可以将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;
}
- 它是基本类型(数量的整数)的集合,由实体键控
- 它是多值的,因此需要一个单独的表;您可以选择指定其名称
- 单独的收集表将包含指向
Order
实体的列、指向Product
的列和数量值本身的列。这使您可以设置引用Product
表的 FK 的名称,并且是可选的。 - 这使您可以指定保存数量值的列的名称。也是可选的。
如果您有理由认为这还不够,那么您可能需要创建一个代表关联的不同实体,例如:
Order
←OrderItem
→Product
Order
有很多OrderItem
s,Product
有很多OrderItem
s,Order
有很多Product
s间接通过OrderItem
,Product
可以在许多Order
s中找到,间接通过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;