【问题标题】:Record not inserted while using @ManyToOne mapping使用 @ManyToOne 映射时未插入记录
【发布时间】:2014-09-06 22:55:11
【问题描述】:

我有 2 个表 'orders' 和 'orderlines' 并使用双向 OneToMany 映射。当我保存订单时,记录已成功插入表 'orders'。但我的 'orderlines' 表是空的。没有插入记录。

这是Controller中的保存操作代码。

@RequestMapping(value = "ordersuccess", method = RequestMethod.POST)
    public String processOrder(@ModelAttribute("order") Order order, 
            @ModelAttribute("cart") Cart cart,
            BindingResult result) {

        if (!result.hasErrors()) {          
            Set<OrderLine> orderLines = new HashSet<OrderLine>();
            for(CartLine c : cart.getCartLines()) {
                OrderLine line = new OrderLine();
                line.setOrder(order);
                line.setProduct(c.getProduct());
                line.setProductPrice(c.getProduct().getPrice());
                line.setTotalPrice(c.getPrice());
                orderLines.add(line);
                order.setOrderLines(orderLines);
            }
                orderService.save(order);
                orderLineService.save(orderLine);
        }
        return "ordersuccess";
    }

谁能指出我做错了什么。

编辑: OrderLine.java

public class OrderLine {
     @Id    
     @GeneratedValue  
        @Column(name="orderline_id") 
        private int orderline_id;
        @ManyToOne
        @JoinColumn(name = "order_id")
    private Order order;
        @ManyToOne(targetEntity = Product.class,
            cascade = CascadeType.ALL,
            fetch = FetchType.LAZY)
    @JoinTable(
            name="products",
            joinColumns=@JoinColumn(name="product_id")
                )
    private Product product;

)

Order.java

public class Order {
        @Id
        @GeneratedValue
        @Column(name="id")
        private int id;
        @OneToMany(mappedBy = "order")
        private Set<OrderLine> orderLines;
    //getter/setter

【问题讨论】:

    标签: spring hibernate spring-mvc hibernate-mapping


    【解决方案1】:

    orderLines 对象已创建:

    Set<OrderLine> orderLines = new HashSet<OrderLine>();
    

    然后你添加行到它:

    orderLines.add(line);
    

    但它从未归因于订单或发送到服务层。

    OrderLine.product 映射也应该是这样的

    public class OrderLine {
        @Id    
        @GeneratedValue  
        @Column(name="orderline_id") 
        private int orderline_id;
    
        @ManyToOne
        @JoinColumn(name = "order_id")
        private Order order;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "product_id")
        private Product product;
    
    }   
    

    和 Order.orderLines 应该有一个级联:

    public class Order {
    
        @Id
        @GeneratedValue
        @Column(name="id")
        private int id;
    
        @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
        private Set<OrderLine> orderLines;
    
    }
    

    然后您需要保存 orderLines:

    order.setOrderLines(orderLines);
    

    并保存订单:

    orderService.save(order);
    

    保存订单后,它也会级联订单行和相关产品。

    如果你有双向关联,别忘了设置两边。

    【讨论】:

    • 我也应该保存订单吗?
    • 如果你有一个双向关联,你必须让双方同步。
    • 我创建了 DAO 和服务类并尝试保存订单,但它抛出 SQLException: Field 'product_id' doesn't have a default value 。如何设置product_id?它已经只是自动递增。请查看我的编辑。
    • 我需要 Order 和 Product 类以及 orderService.save 代码和它调用的任何 DAO,以找出问题所在。
    • 现在可以工作了。我猜我在保存的控制器代码中做错了。但是我在实体类映射中错了。
    猜你喜欢
    • 2017-12-15
    • 2020-01-30
    • 1970-01-01
    • 2013-06-20
    • 2021-02-02
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多