2012-02-17 80 views
2

我在hibernate(MySQL数据库存储)中有两个实体,它们是相关的多对多的。 这些是“项目”和“类别”。休眠多对多关系只保存连接表中的关联

项目< --->类别

我有一个连接表名为“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> 

这是我想达到什么..

我想保存的项目和关联类(在这里我不想创建任何新的分类只是我PROJECT_ID的CATEGORY_ID关联) 。类别已经存在,我希望在保存新项目时使用它们。

在代码中,我创建了一个所需类别的集合(在类别表中有许多类别),并添加到Project实例并尝试使用休眠保存项目。现在期待project_category包含项目和类别的关联。我正在观察,当保存项目,休眠试图分类(这不是我想要的,因为我已经有类别创建 - 我想只是将它与我​​的新项目)。

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

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

回答

0

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

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

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

感谢您的回答。实际上,问题是使用.persist()调用。我将它改为.save(),它工作。不知道它为什么试图插入到Categories表中。 – Anil 2012-02-23 19:44:23

+0

你有一个级联=坚持你的映射,但没有级联=保存。 – 2012-02-23 19:46:45

0

当类别的数据库已经存在,您只需设置级联没有。对许多项目许多配置和类别如下:

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

从项目只有project_category表此配置Hibernate的插件。