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

时间:2014-01-25 01:01:24

标签: java hibernate jpa

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

我有两个问题:

  1. @ManyToOne是否适合地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示?如果没有,我该怎么做呢?
  2. 假设1.没问题,我如何使映射双向(我应该在Address实体中使用哪些注释?)?可以通过在Address
  3. 中的注释中列出多个列来完成此操作

    代码:

    @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;
    }
    

1 个答案:

答案 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;