Spring引导和Thymelaf中带有嵌套List对象的Post对象



Spring/Thymeleaf初学者事先很抱歉,但我有两个实体Employee和MeetingInfo。Employee与MeetingInfo有oneToMany关系,因此基本上一个Employees可以有许多MessageInfo。使用psvm,我可以使用以下内容将具有多个MessageInfo的新员工添加到我的数据库中:

Employee employee1 = new Employee("Employee 1");
MeetingInfo mInfo1 = new MeetingInfo(LocalDate.of(2021, 1, 1), "First Random message");
MeetingInfo mInfo2 = new MeetingInfo(LocalDate.of(2021, 2, 2), "Second Random message");
MeetingInfo mInfo3 = new MeetingInfo(LocalDate.of(2021, 3, 3), "Third Random message");
employee1.getMeetingInfo().add(mInfo1);
employee1.getMeetingInfo().add(mInfo2);
employee1.getMeetingInfo().add(mInfo3);
employeeRepository.save(employee1);

但是我怎样才能用百里香的形式做到这一点呢?我只能添加一个员工,但不能添加新的MeetingInfo对象。当我这样做时,我会得到一个passException错误。

我的新员工.html

<form action="#" th:action="@{/ines/saveEmployee}" th:object="${employee}"
method="POST">
<input type="text" th:field="*{name}"
placeholder="Employee Name" class="form-control mb-4 col-4">
*** so if I remove between here***
<input type="date" th:field="*{meetingInfo.meetingDate}"
placeholder="Message Date" class="form-control mb-4 col-4">
<input type="text" th:field="*{meetingInfo.message}"
placeholder="Message" class="form-control mb-4 col-4">
*** and here***
*** how can I include a MessageInfo object with a new Employee?***
<button type="submit" class="btn btn-info col-2">Save Meeting</button>
</form>

我的控制器

@GetMapping("/showNewEmployeeForm")
public String showNewEmployeeForm(Model model) {
Employee employee = new Employee();
model.addAttribute("employee", employee);
return "meeting/new_employee.html";
}
@PostMapping("/saveEmployee")
public String saveEmployee(@ModelAttribute("employee") Employee employee) {
employeeService.saveMessage(employee);
return "redirect:/ines/employees";
}

员工

@Entity
@Table(name = "employee")
public class Employee {
@Id
@Column(name = "employee_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long employeeId;
@Column(nullable = false)
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id", referencedColumnName = "employee_id")
private List<MeetingInfo> meetingInfo = new ArrayList<>();
//Constructors, getters and setters

会议信息

@Entity
@Table(name = "meeting_info")
public class MeetingInfo {
@Id
@Column(name = "meeting_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long meetingId;
private String message;

@Column(name = "meeting_date")
private LocalDate meetingDate;
//Constructors, getters and setters

用一个请求保存多个实体通常不是你想用你的Spring Boot应用程序做的事情,但是,由于我知道这只是为了练习,你可以通过使用一个DTO对象来实现这一点,该对象将保存两个实体的信息:

public class EmployeeMeetingDTO {
private String employeeName;
private String meetingMessage;
private LocalDate meetingDate;
}

然后,您的控制器可以只接受请求中的单个DTO实体:

@PostMapping("/saveEmployee")
public String saveEmployee(@ModelAttribute("employeeDto") EmployeeMeetingDTO employeeDto) {
employeeService.saveMessage(employeeDto);
return "redirect:/ines/employees";
}

您可以在EmployeeService类中分别创建这两个实体。你的百里香形式会看起来像这样:

<form action="#" th:action="@{/ines/saveEmployee}" th:object="${employeeDto}"
method="POST">
<input type="text" th:field="*{employeeName}"
placeholder="Employee Name" class="form-control mb-4 col-4">

<input type="date" th:field="*{meetingDate}"
placeholder="Message Date" class="form-control mb-4 col-4">
<input type="text" th:field="*{meetingMessage}"
placeholder="Message" class="form-control mb-4 col-4">

<button type="submit" class="btn btn-info col-2">Save Meeting</button>
</form>

最新更新