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

sco*_*777 10 java hibernate jpa

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

我有两个问题:

  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<Order> orders;
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

关于你的第一个问题:它是多对一吗?

这取决于。如果多个订单可以具有相同的送货地址,那么它就是多对一。如果只有一个订单可以具有给定的送货地址,那么它就是 OneToOne。账单地址也一样。

我不确定使关联双向是一个好主意。在这种情况下,我可能不会这样做。但是如果你想让它双向,那么你必须让它们双向。您确实在这里有两种不同的关联。因此,映射如下所示:

@OneToMany(mappedBy = "shippingAddress")
private Set<Order> shippedOrders;

@OneToMany(mappedBy = "billingAddress")
private Set<Order> billedOrders;
Run Code Online (Sandbox Code Playgroud)

或者,如果关联实际上是 OneToOne(请参阅第一个问题的答案):

@OneToOne(mappedBy = "shippingAddress")
private Order shippedOrder;

@OneToOne(mappedBy = "billingAddress")
private Order billedOrder;
Run Code Online (Sandbox Code Playgroud)