我有一个Order
实体和一个Product
实体。订单可以有多个对,代表产品和销售数量。 JPA代表它的合适关系是什么?
(到目前为止,我只找到了将EntityA集合与EntityB相关联的方法。例如,EntityA包含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
。将这种“与价值的关系”表示为一个实体比收集映射更灵活。
你必须映射实体
在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;