我有一个Order
实体和一个Product
实体。订单可以有多个对,代表产品和销售数量。 JPA代表它的合适关系是什么?
(到目前为止,我只找到了将EntityA集合与EntityB相关联的方法。例如,EntityA包含List<EntityB>
。)
答案 0 :(得分:1)
如果数量全部来自此关联,而您无需从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
个,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;