休眠多对多映射反向

时间:2020-02-04 14:23:55

标签: hibernate

考虑以下示例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);

有人可以帮我吗?

1 个答案:

答案 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,也更容易出错。