我有两个实体之间的多对多关系:Item和ItemCategory
在课程项目
中@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>();
每当我尝试保存项目时,即使数据库中存在相同associatedCategories
的类别,也会保存添加到集name
的类别。 hibernate是否有某种方法可以基于name
搜索类别并创建与现有类别的链接,而不是创建新的类别并将项目与新项目链接。
答案 0 :(得分:2)
要使其正常工作,您必须正确实现hashCode和equals方法。如果没有这个HashSet可能会出现不可预测的行为。
答案 1 :(得分:1)
没有。由于name不是类别的ID,因此您可能具有相同名称的severa类别。您可以添加一个唯一约束,但Hibernate不能神奇地知道您在集合中添加的ne类别实际上应该是具有相同名称的现有类别。
创建类别并将其添加到集合时,您应该搜索具有相同名称的类别,如果存在,则将此现有类别放入集合中而不是新集合。