多个@ManyToOne字段指向JPA / Hibernate中的同一实体

我有一个Order实体,它有billingAddressshippingAddress 。 我也有一个Address实体。 我正在努力使一个地址表同时包含送货地址和帐单地址,因为没有什么可以区分它们,并且帐单和送货地址可以在一个或多个订单中相同。 我在Order的地址字段上使用了@ManyToOne ,但我不确定这种双向的正确方法。

我有两个问题:

  1. @ManyToOne是否适用于地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示? 如果没有,我该怎么办呢?
  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;