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

Posted

技术标签:

【中文标题】双向多对一关联。插入新子项时,还会插入一个新的不需要的父项,并与子项具有相同的名称【英文标题】:Bidirectional many-to-one assosiation. When inserting a new Child a new unwanted Parent ist also inserted with the same Name from the Child 【发布时间】:2021-11-30 07:27:39 【问题描述】:

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

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

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

HTML view

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

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";     
        

非常感谢任何帮助

【问题讨论】:

【参考方案1】:

我在我的 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>

【讨论】:

以上是关于双向多对一关联。插入新子项时,还会插入一个新的不需要的父项,并与子项具有相同的名称的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 多对一关联查询

mybatis--多对一关联

在双向多对一关联关系中如果由两端维护关联的关系会出问题

mybatis多对一关联

hibernate多对一关联映射两种形式的理解

Codeigniter - 教义插入错误 - 多对一关系