2011-05-31 20 views
0

我有很多2个实体之间一对多的关系:项目和ItemCategoryHibernate的多对多连接到现有的记录

在类项目

@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE}) 
@JoinTable(
     name="LINK_ITEM_CATEGORY", 
     joinColumns={@JoinColumn(name="ITEM_ID")}, 
     inverseJoinColumns={@JoinColumn(name="CATEGORY_ID")} 
     ) 
private Set<ItemCategory> associatedCategories = new HashSet<ItemCategory>(); 

在课堂ItemCategory

@Column(name="NAME") 
private String name; 

@ManyToMany(mappedBy="associatedCategories") 
private Collection<Item> comprisesExpenditure = new ArrayList<Item>(); 

每当我尝试保存项目时,即使数据库中存在相同的name类别,添加到设置associatedCategories的类别也会被保存。有没有什么方法让hibernate根据name搜索类别,并创建一个与现有链接的链接,而不是创建一个新的类别和链接项目与新的。

回答

1

不可以。由于名称不是类别的ID,所以您可能有同名的类别。你可能会添加一个唯一的约束,但是Hibernate不能奇迹般地知道你添加到集合中的ne类实际上应该是一个具有相同名字的现有类。

当创建类别并将它们添加到集合中时,您应搜索具有相同名称的类别,如果存在,请将此现有类别放入集合中而不是新集合中。

+1

这工作。我搜索了类别,如果发现将它们替换为与该项目关联的集合。项目和类别在此之后正确链接,如果尚未存在,则创建新类别。 – Sumit 2011-06-13 10:12:30

2

为了能够正常工作,必须正确实现hashCode和equals方法。没有这个HashSet可能表现不可预测。

+0

是的,我已经实施了他们,但没有包括他们上面。但是这只能保证与特定支出相关的唯一类别。但是,我无法在多个支出中重复使用任何类别。 – Sumit 2011-05-31 09:08:58

相关问题