Всякий раз, когда я пытаюсь обновить меню и ингредиенты, он просто вставляет новые значения в базу данных.
Я проверил и попытался обновить Только объект меню, и это сработало.
Есть ли «хороший способ» обновить несколько классов сущностей? (Я проверил, и 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>
Да, это создает новый объект Ingredients. Я чувствовал, что что-то не так с этой строкой кода. Любая идея, как обойти это?
обойти это? Не создавайте новые сущности, если хотите обновить. Я не уверен, что понимаю тебя. Можете ли вы уточнить?
А что плохого в том, чтобы вставить новые значения? Если вы создаете новые объекты, они должны быть сохранены в базе данных.
Я имею в виду, как обновить обе сущности. Даже если я удалю эту строку кода и оставлю только menuRepository.save(menu), он все равно добавит новый элемент вместо его обновления. Настоящим мозголомом для меня является то, что он отлично работает, если я обновляю только объект «Меню», но ломается, когда я также добавляю «Ингредиент».




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