java - JSP 形式中具有多个属性的 OneToMany 关系

标签 java forms hibernate jsp spring-mvc

我有这个模型:

订单.java

@Entity
@Table(name = "`order`")
public class Order {
    private Long id;
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "order")
    private List<OrderProduct> orderProducts;

    @Override
    public int hashCode() {
        return new Long(id).hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Order)) {
            return false;
        }
        return this.id == ((Order) obj).getId();
    }

    /* getters & setters */
}

OrderProduct.java

@Entity
@Table(name = "order_product")
public class OrderProduct {
    private Long id;
    private String name;
    private Long quantity;
    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

    /* getters & setters */
}

这个 Controller :

OrderController.java

@Controller
@SessionAttributes({"products"})
public class OrderController {
    @Autowired
    private OrderService orderService;

    @Autowired
    private ProductService productService;

    @Autowired
    private SecurityService securityService;

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/order/add", method = RequestMethod.GET)
    public String addOrder(Model model) {
        Order order = new Order();
        order.setOrderProducts(new AutoPopulatingList<>(OrderProduct.class));
        model.addAttribute("orderForm", order);
        model.addAttribute("products", productService.findAll());
        return "order/add";
    }

    @RequestMapping(value = "/order/add", method = RequestMethod.POST)
    public String addOrder(@ModelAttribute("orderForm") Order orderForm, BindingResult bindingResult, Model model) {
        orderForm.setUser(userService.findByUsername(securityService.findLoggedInUsername()));
        for (OrderProduct orderProduct : orderForm.getOrderProducts()) {
            orderProduct.setOrder(orderForm);
        }
        orderService.save(orderForm);
        return "redirect:/order/view";
    }
}

我想创建一个表单,用户可以在其中选择几种产品,给出数量并提交订单。我试图编写这样的 JSP 代码:

<form:form method="POST" modelAttribute="orderForm">
    <spring:bind path="orderProducts">
        <tr>
            <td>
                <c:forEach items="${products}" var="product">
                    <form:checkbox path="orderProducts[${product.id}].name"
                        value="${product.name}"
                        label="${product.name}"/>
                    <form:input type="text" path="orderProducts[${product.id}].quantity" placeholder="Quantity"/>
                </c:forEach>
            </td>
        </tr>
    </spring:bind>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
</form:form>

...但不幸的是,它可能试图创建与我在产品列表中一样多的 orderProducts,因此服务尝试保存的 orderProducts 没有正确设置的值,最后创建了一个没有 orderProducts 的订单。所以我的问题是如何通过 JSP 代码正确地将 orderProducts 发送到 Controller ,最终将为其项目创建正确的订单?

最佳答案

我怀疑这个${product.id}。由于这是一个索引值,因此应该类似于
orderProducts[0].name orderProducts[0].quantity
orderProducts[1].name orderProducts[1].quantity
orderProducts[2].name orderProducts[2].quantity

关于java - JSP 形式中具有多个属性的 OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41537990/

相关文章:

java - 如果流过滤条件不返回任何结果,则返回单个元素的列表

java - 斐波那契迭代 : To find the nth term of the Fibonacci sequence for n > 50

javascript - 如何将初始页面的 url 保存为 js 中的变量并在提交表单后使用它?

javascript - 使用 Enter 键提交普通脚本表单

java - 如何选择选定的月份数据

java - DAO 和 Spring Autowired

java - 将本体显示为树

java - Intent 和模拟器转换

java - SQL2005 的方言

java - 如何使用带有 hibernate 注解的 Map