JPA:用多个主机建模一个 child table

JPA: Modeling one child table with multiple masters

需要帮助来弄清楚如何为这些实体 bean 建模。要求是:将标签关联到 master1 和 master2 tables(类似于我们在 SO 中分配给问题的标签)。

因为我以后会有很多主 table,所以我为带有 master_type 列的标签创建了一个 table,如果标签我将存储 1与 master1 中的一行相关,如果标记与 master2 中的一行相关联,则为 2,依此类推。

我的问题是我不知道如何在 Tag 实体中声明此关联(代码如下)。我有很多 @JoinColumn ,每个大师一个,但这似乎不对。有什么想法吗?

@Entity
@Table (name="tags")
public class TagEntity {


    /*
     * Assign an id to the entry
     */ 
    @Id 
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;


    /*
     * This id identifies the tag that is associated to the master table
     */ 
    @Column(name="tag_id")
    private Intger tagId;


    /*
     * This id identifies the master table
     */ 
    @Column(name="master_id")
    private Integer master_Id;


    /*
     * This id identifies the type of master table
     */ 
    @Column(name="master_type")
    private Integer master_type;


    @JoinColumn(name = "master1_id", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Master1Entity master1;


    @JoinColumn(name = "master2_id", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Master2Entity master2;

    // getters and setters

}

首先,你为什么使用@ManyToOne?据我了解,一个标签可以与许多表相关。 所以你需要的是在每个主实体中都有一个外键。要以一种很好的方式实现这一点,您可以像这样使用 @MappedSuperclass:

@MappedSuperclass
public class Master{

  @ManyToOne
  @JoinColumn(name="tag")
  protected TagEntity tag;


  ...  // other shared fileds
}

然后像这样声明每个 Master class:

@Entity
public Master1 extends Master{
  ... //fields reserved only for entity master1
}

您可以通过输入 TagEntity @OneToMany(引用 Master class)来存储特定标签所属的 masters 列表,但这不是强制性的,取决于您的需要。