0

我需要向现有的 Hibernate 实体添加新的多对多关系。我不想触及原始的 Hibernate 实体 bean 或其配置。我要添加的是“标记”功能,可以将其视为外部贡献,而不是实体数据本身的一部分。

我想要一个只有两列的简单连接表,即实体主键和标签 ID。

我可以在不引入包含单个标记映射的新(人工)实体类型的情况下使用 Hibernate 来管理此表吗?

还是我被误导了,实际上应该想要拥有这个“关系实体”,以便以后可以添加属性(例如时间戳)?

4

1 回答 1

1

Hibernate 背后的想法是能够从给定的起点遍历 Java 对象树。如果您想定义从原始对象到标记对象的多对多关系,您仍然可以在标记对象上定义它,它将正确地允许您获取具有该标记的原始对象的列表。

缺点是您将无法查询原始对象的标签列表(这将需要一个注释来反转关系和一个返回标签对象集列表的访问器)。但是,您将能够检索标有给定标签的原始对象的列表。

下面是一个例子……假设要标记的对象是一个帖子。如果是这样,下面是向标签添加多对多关系的代码,以便您可以查找具有特定标签的帖子列表:

@ManyToMany
@JoinTable(
    name = "TAG-POST",
    joinColumns = {@JoinColumn(name = "TAG-ID")},
    inverseJoinColumns = {@JoinColumn(name = "POST-ID")}
)
private Set<Posts> posts = new HashSet<Post>();

通常,您还希望能够查找与帖子相关的所有标签,但您可以省略反向映射。如果您确实需要反向映射,则需要将类似这样的内容添加到您的 Post 对象中:

@ManyToMany(mappedBy = "tags")
private Set<Tag> tags = new HashSet<Tag>();

现在您还可以查找与帖子相关的标签。

重读您的帖子(并查看您的评论)后,我意识到您也有兴趣跳过创建标签实体。如果只有标签名称,您可以想象只使用您描述的表格,但您需要稍微转变一下心态。您真正描述的是 Post 与其标签条目之间的一对多关系。在这种情况下,您需要将帖子映射到一系列标签记录,这些记录有两列……一个 POST-ID 和一个 TAG-NAME。在不更改原始对象的情况下,您仍然可以在表中查询具有特定 TAG-NAME 的 Posts 列表或与特定 Post 相关的 TAG-NAME 行列表。

请注意,这实际上并没有消除实体......您不会拥有 Tag 实体,但必须将多对多查找表创建为多对一关系,这使其成为实体本身。然而,这种方法确实少用了一张桌子。

于 2008-10-06T01:23:25.817 回答