使用spring mvc处理百里香的一对多关系

我有一个实体作为供应商,另一个实体作为地址,它们之间的关系是一对多形式供应商要解决 .

注意:我正在使用JPA

我的供应商实体

public class Vendor {

 private Integer id;

  private String name;

  private List<Address> address;

 // getter and setters

}

地址类:

public class Address {

private Integer id;

private String addressline1;
private String addressline2;

//getter and setters 
}

现在我正在使用Thymeleaf,我有一个场景,我需要动态地将地址添加到特定供应商的表单中 .

如何在spring mvc中使用Thymeleaf为供应商中的Address对象进行对象绑定?

回答(2)

3 years ago

评论如果我不理解你的问题是正确的,那对我来说有点不清楚......

为了访问供应商的地址,您在控制器中提供供应商(类似于 model.addAttribute("vendor", currentVendor); )并在您的html文件中调用vendor.address . 请注意,这将为您提供一个列表,因此您需要迭代以显示所有地址:

<tr th:each="address : ${vendor.address}">
    <td th:text="${address.id}">1</td>
    <td th:text="${address.addressline1}"></td>
    <td th:text="${address.addressline2}"></td>
</tr>

3 years ago

嗯,'s tricky because binding to form doesn'以动态的方式工作 . 这意味着你不能做像@Viergelenker建议 AND 将每个地址对象绑定到他自己的形式 .

您可以向模型添加单个地址对象,例如

model.addAttribute("address", addressObject); // Snippet for Model-object
modelAndView.addObject("address", addressObject); // Snippet for ModelAndView object

然后在yout模板中定义一个表单,如:

<form .... method=".." th:object="${address}">
  <input type="hidden" th:field="*{id}" >
  <input type="text" th:field="*{addressline1}" >
  <input type="text" th:field="*{addressline2}" >
</form>

遗憾的是,无法向模型添加数组或列表,并将该集合中的每个对象绑定到自己的表单:

/* The following code doesn't work */
<th:block th:each="address : ${addresses}">
    <form .... method=".." th:object="${address}">
      <input type="text" th:field="*{addressline1}" >
      ...
    </form>
</th:block>

要么

/* The following code doesn't work */
<th:block th:each="address, stat : ${addresses}">
    <form .... method=".." th:object="${addresses[__stat.index__]}">
      <input type="text" th:field="*{addressline1}" >
      ...
    </form>
</th:block>

你可以做的是不使用表单绑定,只是从没有绑定的表单中发送一些名称 - 值对(只使用名称和th:value属性,而不是表单中的th:field属性)到控制器,得到它们来自HttpServletRequest对象并创建/更新/删除地址对象...或将整个Vendor对象绑定到表单(注意使用stat.index):

<form th:object="${vendor}">
    <input type="hidden" th:field="*{id}">
    <input type="hidden" th:field="*{name}"> // feel free to make that field editable
    <th:block th:each="addr, stat : *{address}">
      <input type="hidden" th:field="*{address[__${stat.index}__].id}">         
      <input type="text" th:field="*{address[__${stat.index}__].addressline1}">
      <input type="text" th:field="*{address[__${stat.index}__].addressline2}">
    </th:block>
 </form>