spring-data-jpa 使用一个Thymeleaf表单进行部分表更新和@OneToMany持久性(带验证)

xj3cbfub  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(119)

我有一个user表和一个user_details表。user表由脚本填充一部分,其余的agebirthplace值由用户通过Thymeleaf窗体手动添加。作为窗体的一部分,我还希望在user_details表中添加详细信息。关系是@OneToMany。
我遇到了几个无法正确解决的验证问题:
1.由于表单中的5个字段中只有2个字段要保存到表user中,因此在验证失败的情况下,使用隐藏输入是将所有用户字段值传递给save方法的最佳方式,还是一种更干净的方式(即JPA注解类型方式等)?
1.在初始加载用户时,UserDetails在user.html文件中使用th:each="detail: ${user.userDetailsById}"进行迭代。但是,当保存方法验证失败并且从result.hasErrors()块返回user.html文件时,这些详细信息将恢复为null并且不显示。我是否必须再次手动查询这些详细信息?
1.表单中的对象是一个User对象。如果我想在表单输入中传递一个user_details注解,该如何将其结构化并持久化到user.user.userDetailsById.comment中?
我已经包含了下面的代码。
第一个问题:

ufj5ltwl

ufj5ltwl1#

1.当提供一个对实体进行部分编辑的表单时,我个人会使用一个单独的bean来提交表单,其中只有可编辑字段和一个隐藏的id字段,然后在服务层中找到具有该id的实体,并根据表单中提交的内容编辑其值。
1.不,您不需要再次手动查询字段。这些字段为空的原因是它们在发布表单时没有正确绑定,只要您将它们与表单一起发布,它们就会在您返回错误时返回。列表字段需要一个类似*{userDetailsById__[iter.index]__.comments}的名称,其中iter来自每个循环th:each="iter, detail: ${user.userDetailsById}"。有关如何执行此操作的详细信息,您可以查看https://www.baeldung.com/thymeleaf-list#list-selection-expression
1.见第2段
附言:你的问题中不需要SQL,也不需要概述页面html,因为它们与你所问的问题无关。我想说,只需要编辑页面html、控制器和实体(以及服务,如果相关的话)就足够了

相关问题