2008-10-06 67 views
0

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

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

我可以使用Hibernate来管理这个表,而不用引入一个包含单个标记映射的新(人造)实体类型吗?

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

回答

1

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

缺点是你不能查询原始对象的标签列表(这将需要一个注解来反转关系,并且一个访问器返回一组标记对象的访问器)。但是,您将能够检索标有给定标签的原始对象列表。

下面是一个例子...让我们假设被标记的对象是一个Post。如果是这样,这里的添加到标签多对一对多的关系,这样就可以查找具有特定标签的帖子列表代码:

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

通常情况下,你想也想能够查找与帖子相关的所有标签,但是您可以省略反向映射。如果您确实需要反向映射,你需要像这样添加到您的帖子对象:

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

现在你也可以去查找相关的帖子标签。

重读您的文章(并查看您的评论)后,我意识到您也有兴趣跳过创建Tag实体。如果除了标签名称之外什么都没有,你可以想象地只使用你描述的表格,但你需要改变你的想法。你真正描述的是Post和它的Tag条目之间的一对多关系。在这种情况下,您需要将帖子映射到一系列标记记录,这些记录有两列:一个POST-ID和一个TAG-NAME。在不更改原始对象的情况下,您仍然可以查询表格以获取具有特定TAG-NAME的帖子列表或与特定帖子相关的TAG-NAME行列表。

请注意,这实际上并没有消除一个实体...您不会有标记实体,但多对多查找表必须创建为多对一关系,使其成为一个实体。然而这种方法使用少一个表。

+1

不能从原始对象转到标记是可以的。标签被视为外部附加组件。我只想知道我是否需要“标记对象”(如果我可以没有额外的实体,但仍然使用Hibernate来管理表)。 – Thilo 2008-10-06 01:26:46

相关问题