我正在使用Spring Boot 2.0.2和Thymeleaf 3.0.8。 我想理解为什么Spring在以下情况下会表现出这种方式。 我们有两个实体Order和OrderDetails,它们的定义如下:
@Entity
@Table(name = "order")
public class Order{
@NotNull
@OneToMany(mappedBy="order")
private List<OrderDetail> orderDetails;
...
}
@Entity
@Table(name = "OrderDetail")
public class OrderDetail {
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
@Column
private Foo foo;
...
}
在下面显示的控制器中,我们有一个方法addDetail(),在其中创建了OrderDetail的新实例,设置了一些值,并在Order中的OrderDetails列表中添加了该实例。然后,控制器将模型传递到视图“ order.html”。 我们最终将调用方法save()将Order及其详细信息持久保存到数据库中。
@Controller
public class OrderController {
@PostMapping(value="/add_detail")
public String addDetail(@ModelAttribute @Valid Order order){
OrderDetail detail= new OrderDetail();
Foo foo = new Foo();
detail.setFoo(foo);
orderDetail.order(order);
order.getOrderDetails().add(orderDetail);
return "/order";
}
@PostMapping(value="/save_order")
public String save(@ModelAttribute @Valid Order order){
orderService.save(order);
return "/orders";
}
}
这是棘手的部分:当我们将视图发布回控制器时,调用save()方法时,OrderDetails中的引用foo为空,除非从视图中对其进行引用,如下所示:
`..
<form th:object="${order}"
<table>
<tbody>
<tr th:each = "row, rowStat : *{orderDetails}">
<td><input type="hidden" readonly th:field="*{orderDetails[__${rowStat.index}__].foo}" ></td>
...`
为什么要在整个请求中保持其值,为什么必须引用foo? 除了拥有一堆隐藏字段之外,还有其他选择吗?