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

Java 多个@manytone字段指向JPA/Hibernate中的同一实体,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个订单实体,它有一个账单地址和一个发货地址。我还有一个地址实体。我试图使一个地址表同时包含发货地址和账单地址,因为没有什么可以区分它们,并且一个或多个订单中的发货地址和账单地址可以相同。我已经在顺序中的地址字段中使用了@ManyToOne,但我不确定如何使其双向 我有两个问题: @ManyToOne是否适用于地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示?如果没有,我应该怎么做 假设1。如果可以,我如何使映射双向(我应该在地址实体中使用什么注释?)?这可以通过在地址

我有一个
订单
实体,它有一个
账单地址
和一个
发货地址
。我还有一个
地址
实体。我试图使一个地址表同时包含发货地址和账单地址,因为没有什么可以区分它们,并且一个或多个订单中的发货地址和账单地址可以相同。我已经在
顺序中的地址字段中使用了
@ManyToOne
,但我不确定如何使其双向

我有两个问题:

  • @ManyToOne
    是否适用于地址字段,因为它实际上是一个n:2关系,我只是使用两个单独的字段来表示?如果没有,我应该怎么做
  • 假设1。如果可以,我如何使映射双向(我应该在
    地址
    实体中使用什么注释?)?这可以通过在
    地址
    中的注释中列出多列来实现吗
  • 代码:

    @实体
    @表(name=“orders”)
    公共阶级秩序{
    //...
    私人地址;
    私人地址计费地址;
    @许多酮
    @JoinColumn(name=“shipping\u address\u id”,referencedColumnName=“address\u id”,nullable=false)
    公共地址getShippingAddress(){
    返回发货地址;
    }
    @许多酮
    @JoinColumn(name=“billing\u address\u id”,referencedColumnName=“address\u id”,nullable=false)
    公共广播getBillingAddress(){
    返回账单地址;
    }
    //...
    }
    @实体
    @表(name=“地址”)
    公共课堂演讲{
    //地址1、地址2、城市、州等。
    //如何链接回订单?
    私人定单;
    }
    
    关于您的第一个问题:它是多功能的吗

    视情况而定。如果多个订单可以有相同的发货地址,那么它就是多个订单。如果只有一个订单可以有一个给定的发货地址,那么它就是一个OneTone。账单地址也一样

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

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

    我建议您尝试
    每类一个表的层次结构
    方法。那么,在对象级别上,其他一切都会更简单。我没有这样做的原因是,地址之间实际上没有区别,因此将它们设置为不同的类在语义上没有意义,而且使用相同的地址作为帐单和发货地址会更混乱。许多订单可以具有相同的地址. 我还不确定是否有一个很好的理由使关联双向,但我想知道如何做,以防它在未来变得重要。
    @OneToMany(mappedBy = "shippingAddress")
    private Set<Order> shippedOrders;
    
    @OneToMany(mappedBy = "billingAddress")
    private Set<Order> billedOrders;
    
    @OneToOne(mappedBy = "shippingAddress")
    private Order shippedOrder;
    
    @OneToOne(mappedBy = "billingAddress")
    private Order billedOrder;