Hibernate多对多关系只保存连接表中的关联

时间:2012-02-17 07:46:22

标签: hibernate hibernate-mapping

我在hibernate(MySQL数据库存储)中有两个实体,它们有很多相关。 这些是“项目”和“类别”。

项目< --->分类

我有一个名为“project_category”的连接表来连接存储在“project”和“category”表中的这些实体。连接表仅存储来自这些表的主键。这些键是“project_id”和“category_id”。

我有固定数量的类别。类别表已填充了项目的可能类别列表。创建新项目时,它属于一个或多个类别,并存储在

在我的“Project”类映射中,我使用“project_category”表指定了从Project到Category的多对多导航,如下所示:

<set name="categories" table="project_category" fetch="join" cascade="persist">
   <key column="project_Id" />
   <many-to-many column="category_Id" class="Category"/>
</set>

这就是我想要实现的目标..

我想保存项目和相关类别(这里我不想创建任何新类别,只需将category_id与我的project_id相关联)。类别已经存在,我想在保存新项目时使用它们。

在代码中,我创建了一个所需类别的集合(我在Category表中的许多类别中)并添加到Project实例并尝试使用hibernate保存项目。现在期望project_category包含项目和类别的关联。

我观察到在保存Project时,hibernate尝试使用Category(这不是我想要的,因为我已经创建了类别 - 我想将它与我的新项目关联起来。)

上述目标需要达到什么样的映射?

我读了这篇好文章但是这里的作者正在创建两个实体,而不是使用已创建的实体。 http://technicalmumbojumbo.wordpress.com/2007/09/25/investigating-hibernate-associations-many-to-many/

2 个答案:

答案 0 :(得分:0)

如果类别已存在,则不应创建新实例。您应该使用Hibernate会话从数据库中获取它们。

如果您拥有需要与新项目关联的类别的ID,并且您不想发出选择查询以从数据库中获取这些类别(因为这些类别不在数据库,然后只需使用Session.load()方法:

Set<Long> categoryIds = ...;
for (Long categoryId : categoryIds) {
    Category category = (Category) session.load(Category.class, categoryId);
    newProduct.add(category);
}

答案 1 :(得分:0)

当数据库中已存在类别时,您只需将级联设置为无。项目和类别的多对多配置如下:

<set name="categories" table="project_category" fetch="join" cascade="none">
      <key column="project_Id" />
      <many-to-many column="category_Id" class="Category"/>
</set>

从这个配置中,hibernate仅在project和project_category表中插入。