首页 > 解决方案 > 双向多对一关联。插入新子项时,还会插入一个新的不需要的父项,并与子项具有相同的名称

问题描述

我的目标是从下拉列表中选择现有的父项,并在文本输入中创建一个名称为新的子项。

插入新子时,还会插入一个新的不需要的父级,其名称与新子级相同。我认为我的问题出在我的 HTML 代码中,但我已将所有相关代码添加到问题中。

我正在使用 Spring MVC、Spring JPA 和 Thymeleaf。

HTML 视图

提交后,我在控制台中得到了这个

Marken name= Example Marke
Geschaeftsfeld name= Example Marke
Hibernate: insert into geschaeftsfeld (name, id) values (?, ?)
Hibernate: insert into Marke (geschaeftsfeld_id, name, id) values (?, ?)

如您所见,父名称和子名称相同。父名称应该是下拉列表中选择的名称。

我认为错误出在我的 HTML 代码(thymeleaf)中,由于某种原因,它为这两个属性设置了相同的名称。如果我错了,我在下面添加了我的父类代码和子类。

       <form action="#" th:action="@{/neuemarke}" th:object="${marke}" method="POST">                       
          <select class="form-control" th:field="${geschaeftsfeld}" id="geschaeftsfeld">
            <option value="0">select Geschaeftsfeld</option>
            <option th:each="gf : ${listAllGf}" th:value="${gf.id}" th:text="${gf.name}"></option>
          </select>
   
          <input type="text" th:field="${marke.name}" placeholder="Name" class="form-control mb-4 col-4">
          <button type="submit" class="btn btn-info col-2"> Save </button>
        </form>

控制器

        @GetMapping({"/einstellungenmarken"})
        public String einstellungenMarke(Model model) {
            //fügt die listen zu den Modell hinzu
            model.addAttribute("listAllGf", gfService.getAllGeschaeftsfelds());
            model.addAttribute("listAllMk", mkService.getAllMarken());
            model.addAttribute("geschaeftsfeld", new Geschaeftsfeld());
            model.addAttribute("marke", new Marke());
            //gibt den template zurück (HTML)
            return "/Einstellungen/marken";
        }

        @PostMapping("/neuemarke")
        public String neueMarke(@ModelAttribute("marke") Marke marke, 
        @ModelAttribute("geschaeftsfeld") Geschaeftsfeld geschaeftsfeld) {
            System.out.println("Marken name= " + marke.getName());
            System.out.println("Geschaeftsfeld name= " + 
            geschaeftsfeld.getName());
            marke.setGeschaeftsfeld(geschaeftsfeld);
            mkService.save(marke);
            return "redirect:/einstellungenmarken";     
        }

任何帮助深表感谢

标签: mysqlspring-bootspring-mvcspring-data-jpathymeleaf

解决方案


我在我的 HTML 代码中发现了错误。

th:field="*{geschaeftsfeld}"代替th:field="${geschaeftsfeld}"

th:field="*{name}"代替th:field="${marke.name}"

<form action="#" th:action="@{/neuemarke}" th:object="${marke}" method="POST">                      
    <select class="form-control" th:field="*{geschaeftsfeld}" id="geschaeftsfeld">
        <option value="0">select Geschaeftsfeld</option>
        <option th:each="gf : ${listAllGf}" th:value="${gf.id}" th:text="${gf.name}"></option>
    </select>                                       
    <input type="text" th:field="*{name}" placeholder="Name" class="form-control mb-4 col-4">
    <button type="submit" class="btn btn-info col-2"> Save </button>
</form>

推荐阅读