如何在与主表不是一对一关系时定义SecondaryTable

时间:2011-11-18 11:47:42

标签: java jpa

在项目中,我们必须将一个实体映射到两个表。 table part_info存储商品信息,table part_label存储将在屏幕上显示的标签。

Table part_info
id part_no part_description

Table part_label
id part_no_label part_description_label

然后在我们的实体

@Entity
@Table(name="part_info")
@SecondaryTable(name="part_label",pkJoinColumns=    {@PrimaryKeyJoinColumn(name="id",referencedColumnName="id")})
public class PartInfo implements Serializable {
    @id
    private int id;
@Column(name = "part_no")
private String partNo;
@Column(name = "part_description")
private String partDesc;
@Column(table="part_label",name="part_no_label")
private String partNoLabel;
@Column(table="part_label",name="part_description_label")
private String partDescLabel;
    ....
}

但这只会将part_info的一条记录映射到part_label的一条记录。

在我们的案例中,不同的零件信息可能使用相同的零件标签。 例如 我们将使用从part_label检索的标签,如下所示:

Part# 
Part Desc

但我们从part_info表

中检索了许多部分信息
PA123 AAA
PA123 DDD
PA234 BBB
PA345 CCC

然后在UI中,我们将显示为:

Part#:PA123  Part Desc:AAA
Part#:PA123  Part Desc:DDD

如果在@SecondaryTabel上方使用,则每个part_info和每个part_label都是一对一的关系,如果需要检索PA123的两个部分记录,还需要检索两次相同的标签。

是否有任何方式可以将一个零件标签映射到多个零件信息?

2 个答案:

答案 0 :(得分:2)

您误解了SecondaryTable,因为它只适用于一对一的情况,如果删除该对象,则删除两个表中的行。辅助表中没有“重复使用”条目......因为辅助表具有到主表的FK !!!

如果您想重用某些数据,请将其作为一个单独的实体。

答案 1 :(得分:1)

我认为最合乎逻辑的解决方案是将PartLabel建模为一个单独的实体,并在ManyToOnePartInfo之间建立PartLabel关系。