2011-05-31 41 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

相關問題