Сохранить объект в нескольких других объектах, используя Hibernate - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время я пытаюсь создать простое веб-представление каталога и использую Spring и Hibernate для сохранения данных. Я хочу иметь Template, который является Product, и в этом шаблоне должно быть несколько Ingredients, которые также Products.

Это мои занятия:

Template.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...

}

Ingredient.java

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

Product.java

Этот класс происходит из структуры торговой точки. Он обрабатывает сохранение name и price , но также обрабатывает такие вещи, как ID для Hibernate.

public void initialize ()

Этот метод предоставляет фиктивные данные для целей тестирования.

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
}

При запуске этого кода я всегда получаю сообщение об ошибке такого типа:

Unique index or primary key violation: "UK_TAGDVK3J2NBLU2MQMBL8HBJV9_INDEX_1 ON PUBLIC.PRODUCT_INGREDIENTS(INGREDIENTS_PRODUCT_ID) VALUES ('f6f05610-ca1f-40b6-b0a8-abaccbc0452b', 2)"; SQL statement:
insert into product_ingredients (template_product_id, ingredients_product_id) values (?, ?) [23505-197]

Я интерпретирую эту ошибку следующим образом: Hibernate пытается создать таблицу для связи шаблонов с ингредиентами, но ключи ингредиентов появляются несколько раз.

Когда я пытался добавить только один ингредиент в список (так, один литр только с сыром, другой с беконом, ...), он прекрасно работал.

Я не совсем знаю, как искать эту тему, и я попытался найти ее, но пока ничего не нашел. Какие изменения мне нужно сделать, чтобы этот код работал, чтобы один объект Ingredient мог появляться в нескольких шаблонах?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы определили отношение @OneToMany между Products и Ingredients, которое фактически является @ManyToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...