春季和百里香,田间结合行为

时间:2018-08-03 14:24:14

标签: spring thymeleaf

我正在使用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? 除了拥有一堆隐藏字段之外,还有其他选择吗?

0 个答案:

没有答案