我的Order
实体有billingAddress
和shippingAddress
。我还有一个Address
实体。我正在努力使一个地址表同时包含送货地址和帐单地址,因为没有什么可以区分它们,并且一个或多个订单中的帐单和送货地址可以相同。我在@ManyToOne
的地址字段中使用了Order
,但我不确定这种双向的正确方法。
我有两个问题:
@ManyToOne
是否适合地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示?如果没有,我该怎么做呢?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<Order> orders;
}
答案 0 :(得分:3)
关于你的第一个问题:它是ManyToOne吗?
这取决于。如果多个订单可以具有相同的送货地址,那么它就是ManyToOne。如果只有一个订单可以有一个给定的送货地址,那么它就是OneToOne。账单地址相同。
我不确定双向关联是个好主意。在这种情况下我可能不会这样做。但是如果你想让它成双向,那么你必须使他们双向。你确实在这里有两个不同的联想。因此映射如下所示:
@OneToMany(mappedBy = "shippingAddress")
private Set<Order> shippedOrders;
@OneToMany(mappedBy = "billingAddress")
private Set<Order> billedOrders;
或者,如果该关联实际上是OneToOne(请参阅第一个问题的答案):
@OneToOne(mappedBy = "shippingAddress")
private Order shippedOrder;
@OneToOne(mappedBy = "billingAddress")
private Order billedOrder;