多个@ManyToOne字段指向JPA / Hibernate中的同一实体
我有一个Order
实体,它有billingAddress
和shippingAddress
。 我也有一个Address
实体。 我正在努力使一个地址表同时包含送货地址和帐单地址,因为没有什么可以区分它们,并且帐单和送货地址可以在一个或多个订单中相同。 我在Order
的地址字段上使用了@ManyToOne
,但我不确定这种双向的正确方法。
我有两个问题:
-
@ManyToOne
是否适用于地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示? 如果没有,我该怎么办呢? - 假设1.可以,我如何使映射双向(我应该在
Address
实体中使用哪些注释?)? 可以通过在Address
中的注释中列出多个列来完成吗?
码:
@Entity @Table(name = "orders") public class Order { //... private Address shippingAddress; private Address billingAddress; @ManyToOne @JoinColumn(name = "shipping_address_id", referencedColumnName = "address_id", nullable = false) public Address getShippingAddress() { return shippingAddress; } @ManyToOne @JoinColumn(name = "billing_address_id", referencedColumnName = "address_id", nullable = false) public Address getBillingAddress() { return billingAddress; } //... } @Entity @Table(name = "addresses") public class Address { //address1, address2, city, state, etc. //how to link back to Orders? private Set orders; }
关于你的第一个问题:它是ManyToOne吗?
这取决于。 如果多个订单可以具有相同的送货地址,那么它就是ManyToOne。 如果只有一个订单可以有一个给定的送货地址,那么它就是OneToOne。 帐单地址相同。
我不确定双向关联是个好主意。 在这种情况下我可能不会这样做。 但是如果你想让它双向,那么你必须使它们双向。 你确实在这里有两个不同的联想。 因此映射如下所示:
@OneToMany(mappedBy = "shippingAddress") private Set shippedOrders; @OneToMany(mappedBy = "billingAddress") private Set billedOrders;
或者,如果该关联实际上是OneToOne(请参阅第一个问题的答案):
@OneToOne(mappedBy = "shippingAddress") private Order shippedOrder; @OneToOne(mappedBy = "billingAddress") private Order billedOrder;