使用休眠模式

时间:2018-11-08 10:08:33

标签: java hibernate

我目前正在尝试制作一个简单的Catalog Web视图,并且正在使用Spring和Hibernate保存数据。我想拥有一个Template的{​​{1}},并且在此模板中应该有多个Product也是Ingredients

这些是我的课程:

Template.java

Products

Ingredient.java

@Entity
public class Template extends Product implements Serializable {

    @OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.MERGE, CascadeType.PERSIST})
    private List<Ingredient> ingredients = new ArrayList<>();

    public Template(String name, Money price, ArrayList<Ingredient> ingredients) {
        super(name, price);
        this.ingredients.addAll(ingredients)
    }

    // Getters and setters...

}

Product.java

此类来自salespoint框架。它可以处理名称 price 的保存,但是还可以处理Hibernate的 ID 之类的东西。

公共无效的initialize()

此方法提供了用于测试目的的伪数据。

@Entity
public class Ingredient extends Product implements Serializable {
    public Ingredient(String name, Money price) {
        super(name, price);
    }
}

运行此代码时,我总是会遇到此类错误:

public void initialize() {
    Ingredient cheese = new Ingredient("Cheese", Money.of(1, "EUR");
    Ingredient bacon = new Ingredient("Bacon", Money.of(1, "EUR");
    Ingredient tomato = new Ingredient("Tomato", Money.of(1, "EUR");

    // add these ingredients into ArrayLists (3 Lists)
    // list1: tomato, bacon
    // list2: bacon, tomato, cheese
    // list3: cheese, tomato

    Template pizza1 = new Template("Pizza 1", Money.of(1, "EUR"), list1);
    Template pizza2 = new Template("Pizza 2", Money.of(1, "EUR"), list2);
    Template salad = new Template("Salad", Money.of(1, "EUR"), list3);

    // saving these in a catalog
}

我这样解释这个错误:Hibernate尝试创建一个表以将模板与配料链接,但是配料键出现多次。

当我尝试在每个列表中仅添加一种成分时(这样一来只含奶酪,一种培根,...),效果很好。

我不太知道如何搜索此主题,因此尝试对其进行谷歌搜索,但尚未找到任何内容。我必须进行哪些更改才能使此代码起作用,以便一个成分对象可以出现在多个模板中?

1 个答案:

答案 0 :(得分:3)

您在@OneToManyProducts之间定义了Ingredients关系,而实际上是@ManyToMany