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 列表,但这不是强制性的,取决于您的需要。
需要帮助来弄清楚如何为这些实体 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 列表,但这不是强制性的,取决于您的需要。