Spring Data Jpa - обновление двух объектов вместе вставляет новое значение

Spring Data Jpa - обновление двух объектов вместе вставляет новое значение

Всякий раз, когда я пытаюсь обновить меню и ингредиенты, он просто вставляет новые значения в базу данных.

Я проверил и попытался обновить Только объект меню, и это сработало.

Есть ли «хороший способ» обновить несколько классов сущностей? (Я проверил, и Menu и ingredientName, ingredientDescription имеют предопределенные идентификаторы, когда пользователь переходит на страницу обновления)

Объект меню:

@Entity
@Table(name = "menu")
public class Menu {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "name")
    private String name;

      // Mapping To second table
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "menu_ingredient",
            joinColumns = @JoinColumn(name = "menu_id"),
            inverseJoinColumns = @JoinColumn(name = "ingredient_id"))
    private List<Ingredients> ingredient = new ArrayList<>();

    //getters / setters / constructors / tostring

Ингредиенты

@Entity
@Table(name = "ingredients")
public class Ingredients {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "ingredient")
    private String ingredientName;

    @Column(name = "description")
    private String ingredientDescription;
    //Getters/Setters/Constructors/ToString

Контроллер (только методы редактирования):

@GetMapping("/edit/{id}")
    public String edit(@PathVariable(name = "id")String id, Model model){
        Optional<Menu> menu = menuRepository.findById(id);

        List<Ingredients> ingredients = menu.get().getIngredient();

        for (Ingredients ing : ingredients){
            System.out.println(ing);
            // To Check data in the List , the output is : 
            // Ingredients{id=70, ingredientName='pizzaing1', ingredientDescription='pizzadesc1'}
        }

        model.addAttribute("ingredients", ingredients);
        model.addAttribute("newMenu",menu);


        return "edit-page";
    }

    @PostMapping("/postEditMenu")
    public String postEdit(@ModelAttribute("newMenu")Menu menu,
                           @RequestParam(name = "ingName")String ingName,
                           @RequestParam(name = "ingDesc")String ingDesc){



    String[] ingNameSplit = ingName.split(",");
    String[] ingDescSplit = ingDesc.split(",");

    for(int a = 0, b = 0; a<ingNameSplit.length; b++, a++){
        menu.getIngredient().add(new Ingredients(ingNameSplit[a], ingDescSplit[b]));
    }
        menuRepository.save(menu);

        return "redirect:/recipeList";
    }

Отредактируйте страницу :

<form action = "#" th:action = "@{/postEditMenu}" th:object = "${newMenu}" method = "post">
        <p>Menu Name: <br><input type = "text" th:field = "*{name}"></p>
        <div id = "wrapper" th:each = "ing: ${ingredients}">
            <label for = "ingredientName"></label>
            <p>Ingredient Name: <br><input th:value = "${ing.ingredientName}" id = "ingredientName" type = "text" name = "ingName"></p>

            <label for = "ingredientDescription"></label>
            <p>Ingredient Description:</p> <textarea id = "ingredientDescription" type = "text" th:text = "${ing.ingredientDescription}" name = "ingDesc"></textarea>
        </div>
        <br>

        <input type = "button" id = "more_fields" onclick = "add_fields();" value = "Add More" />
        <br>

        <input type = "submit" th:value = "Submit">

    </form>

MenuRepository просто расширяет JpaRepository<Menu,String>

new Ingredients(ingNameSplit[a], ingDescSplit[b]); - это сущность Ingredients? Если это так, новые ингредиенты будут сохранены в базе данных, поскольку вы создаете новые объекты.
CrazySabbath 21.01.2019 13:28

Да, это создает новый объект Ingredients. Я чувствовал, что что-то не так с этой строкой кода. Любая идея, как обойти это?

Tornike 21.01.2019 13:33

обойти это? Не создавайте новые сущности, если хотите обновить. Я не уверен, что понимаю тебя. Можете ли вы уточнить?

CrazySabbath 21.01.2019 13:35

А что плохого в том, чтобы вставить новые значения? Если вы создаете новые объекты, они должны быть сохранены в базе данных.

CrazySabbath 21.01.2019 13:39

Я имею в виду, как обновить обе сущности. Даже если я удалю эту строку кода и оставлю только menuRepository.save(menu), он все равно добавит новый элемент вместо его обновления. Настоящим мозголомом для меня является то, что он отлично работает, если я обновляю только объект «Меню», но ломается, когда я также добавляю «Ингредиент».

Tornike 21.01.2019 13:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
268
0

Другие вопросы по теме