当前位置: 首页 > 知识库问答 >
问题:

更新多个实体时的Spring Data JPA问题

都超英
2023-03-14

我有两个实体类“menu”它只有一个字段叫做“name”和第二个实体“fregents”它有两个字段“fregentname”“fregentdescription”。数据库结构

我正在创建一个简单的CRUD web-app,但是update方法不是更新实体,而是在DB中插入新值。我检查了一下,当用户点击指定菜单上的更新时,第一个实体的id和它的配料id也会被预先定义。我是spring boot和thymeleaf的新手,不知道当您有一个以上的实体时如何使用JPA。

菜单实体:

@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

配料实体:

@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);
    }

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


    return "edit-page";
}

@PostMapping("/postEditMenu")
public String postEdit(@ModelAttribute("newMenu")Menu menu){



    menuRepository.save(menu);

    return "redirect:/recipeList";
}

编辑-page.html:

    <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>
@PostMapping("/postEditMenu")
public String postEdit(@ModelAttribute("newMenu")Menu menu,
                       @RequestParam String ingName,
                       @RequestParam String ingDesc){

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

    Menu menuToUpdate = menuRepository.getOne(menu.getId());


    List<Ingredients> newIngredientList = menuToUpdate.getIngredient();
    newIngredientList.clear();

    for(int a = 0, b = 0; a<ingNameSplit.length; b++, a++){
        newIngredientList.add(new Ingredients(ingNameSplit[a], ingDescSplit[b]));
    }
    menuToUpdate.setIngredient(newIngredientList);

    menuRepository.save(menuToUpdate);

    return "redirect:/recipeList";
}
<input type="text" th:field = "*{id}" hidden>
<input type="text" th:value = "${ing.id}" hidden>
for(int a = 0, b = 0; a<ingNameSplit.length; b++, a++){
            newIngredientList.add(new Ingredients(ingNameSplit[a], ingDescSplit[b]));
        }

之后,我设置这个NewIngreditentsList并将菜单本身保存到数据库-

menuToUpdate.setIngredient(newIngredientList);

menuRepository.save(menuToUpdate);

感谢所有的帮助:)

共有1个答案

解高昂
2023-03-14

此时:

@PostMapping("/postEditMenu")
public String postEdit(@ModelAttribute("newMenu")Menu menu){


menuRepository.save(menu);

return "redirect:/recipeList";
}

您从edit-page.html接收菜单,并且它没有id,这就是为什么它总是在数据库中创建新记录的原因。要编辑所需的菜单,您需要在此之前获得它的id。您可以为获取菜单列表创建endpoint,并在html站点中的每个菜单旁边使用“编辑”按钮显示它们。然后,如果用户点击编辑按钮重定向他到您的编辑表单,但这一次您可以传递菜单的ID。

 类似资料:
  • 我有一个User类,它有一些附加属性: 现在,如果我调用一些方法来改变其中一个房子(例如改变它的名称属性),如果我调用,我仍然会得到房子的旧值: 我如何确保它总是更新?

  • 如何使用Spring Rest Controller和Spring Data JPA仅更新从@刚体传递的实体属性? 员工实体: 服务类方法: 请求体: Hibernate更新查询: Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。 我想

  • 在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改。 这是我的Rest控制器: 以下是服务实现: 最初我在服务上有注释。通过删除它而不在方法中使用它,我首先想到的是会话将使用存储库打开和关闭,如这里的答案所示。 这不起作用,我在评论中看到“会话将持续整个HTTP请求处理过程。”所以,在我添加的服务中 然后在我添加的方法中 在我做任何改变之前。然而,我所做的任

  • 我需要在另一个相关实体更新后对一个实体执行更新。 我有两个实体:和,关系为1:N。两者都有字段。状态取决于所有子状态字段。因此,如果更新了一个,我需要重新计算的新状态并持久化/更新它。 我实现了一个监听器: 监听器在中进行了注释,并且正在正确调用它。但是,在流程完成后,仍然保持旧状态,即使使用正确的新状态调用。

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 我目前正在使用最新版本的实体框架进行一个项目,我遇到了一个似乎无法解决的问题。 当涉及到更新现有对象时,我可以很容易地更新对象属性,直到涉及到引用另一个类的属性为止。 在下面的示例中,我有一个名为Foo的类,它存储各种属性,其中2个是其他类的实例 当我使用下面的Edit()方法时,我传入了我想要更新的对象,并且我可以设法使名称正确更新,但是我还没有找到一种方法来更改子对象的属性。例如,如果子对象的