我目前正在尝试制作一个简单的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尝试创建一个表以将模板与配料链接,但是配料键出现多次。
当我尝试在每个列表中仅添加一种成分时(这样一来只含奶酪,一种培根,...),效果很好。
我不太知道如何搜索此主题,因此尝试对其进行谷歌搜索,但尚未找到任何内容。我必须进行哪些更改才能使此代码起作用,以便一个成分对象可以出现在多个模板中?
答案 0 :(得分:3)
您在@OneToMany
和Products
之间定义了Ingredients
关系,而实际上是@ManyToMany
。