考虑以下示例https://www.tutorialandexample.com/hibernate-many-to-many-mapping/
许多(类别)与许多(项目)有关,许多(项目)也与许多(类别)有关
我能够看到每个类别都与项目集相关。 我试图通过同样的例子来做相反的事情。 我要为每个项目集添加类别。是否有可能做到这一点。我曾尝试过,但无法获得。
这是我在主应用中的示例代码
Categories cate3 = new Categories();
cate3.setCate_id(03);
cate3.setCate_name("category 03");
Categories cate4 = new Categories();
cate4.setCate_id(04);
cate4.setCate_name("category 04");
Set set1 = new HashSet();
set1.add(cate3);
set1.add(cate4);
i.setCategories(set1);
有人可以帮我吗?
答案 0 :(得分:2)
这是双向关系,即两个类别的对象都知道它们被分配给哪个对象。您可以按照所示方式并手动保持关系同步。但是,这非常困难且容易出错。
一种更容易理解的方法是为每个类创建一个方法,以在添加新的关系伙伴时保持同步。 Vlad Mihalcea在his article about @ManyToMany
relationships中非常清楚地描述了这种方法。此外,您可以在this article about cascading and synchronisation中找到它。
在这里,他的代码适合您的用例:
@Entity(name = "Category")
@Table(name = "category")
public class Category {
@Id
@GeneratedValue
private Long id;
private String title;
public Category() {}
public Category(String title) {
this.title = title;
}
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id")
)
private Set<Item> items = new HashSet<>();
//Getters and setters ommitted for brevity
public void addItem(Item item) {
items.add(item);
item.getCategories().add(this);
}
public void removeItem(Item item) {
items.remove(item);
item.getCategories().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Category)) return false;
return id != null && id.equals(((Category) o).getId());
}
@Override
public int hashCode() {
return 31;
}
}
@Entity(name = "Item")
@Table(name = "item")
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToMany(mappedBy = "items")
private Set<Category> categories = new HashSet<>();
public Item() {}
public Item(String name) {
this.name = name;
}
//Getters and setters ommitted for brevity
private void addCategory(Category category) {
categories.add(category);
category.getItems().add(this);
}
public void removeCategory(Category category) {
categories.remove(category);
category.getItems().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Item)) return false;
return id != null && id.equals(((Item) o).getId());
}
@Override
public int hashCode() {
return 41;
}
}
顺便说一句:如果ID不自然,则自动生成ID,也更容易出错。