JPA:使用多个母版建模一个子表

时间:2015-01-16 17:38:49

标签: hibernate jpa ejb

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

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

我的问题是我不知道如何在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

}

1 个答案:

答案 0 :(得分:0)

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

@MappedSuperclass
public class Master{

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


  ...  // other shared fileds
}

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

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

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