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;