我在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/
答案 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表中插入。