簡體   English   中英

多個@ManyToOne字段指向JPA / Hibernate中的同一個實體

[英]Multiple @ManyToOne fields pointing to same entity in 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<Order> orders;
}

關於你的第一個問題:它是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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM