Hibernate映射异常

时间:2014-07-15 04:40:01

标签: hibernate

我有两张桌子订单和订单。当我尝试加入两列时,我得到了这个例外。

org.hibernate.MappingException: Unable to find column with logical name: order_id in org.hibernate.mapping.Table(orders) and its related supertables and secondary tables

我的实体类: Order.java

@Entity  
@Table(name="orders")  
public class Order {  

    @Id  
    @GeneratedValue  
    @Column(name="id")  
    private int id;  

    @Column(name="firstname")  
    private String firstName;  

    @OneToMany(targetEntity=OrderLine.class,  
            cascade = CascadeType.ALL,  
            fetch = FetchType.LAZY)  
    @JoinTable(  
            name="orderlines",  
            joinColumns = {@JoinColumn(table = "orderlines", name="FK_orders_orders",   
            referencedColumnName = "order_id")},  
            inverseJoinColumns={@JoinColumn(table = "orders", name="FK_orders_orders",   
            referencedColumnName = "id")}  
            )   
    private Set<OrderLine> orderLines;  

OrderLine.java

@Entity  
@Table(name="orderlines")  
public class OrderLine {  
     @Id      
    @ManyToOne(targetEntity = Order.class,  
            cascade = CascadeType.ALL,  
            fetch = FetchType.LAZY)  
    @JoinTable(  
            name="orders",  
            joinColumns={@JoinColumn(table="orders", name="FK_orders_orders",   
                                        referencedColumnName="id")},  
            inverseJoinColumns={@JoinColumn(table="orderlines", name="FK_orders_orders",  
                                                referencedColumnName="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;

我的表格:

订单

CREATE TABLE `orders` (  
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  
`firstname` VARCHAR(50) NOT NULL,  
);  

订单

    CREATE TABLE `orderlines` (
orderLineId int(11) NOT NULL auto_increment,
`orderId` INT NOT NULL,
`product_id` INT NOT NULL,
`quantity` INT NOT NULL,
`product_price` DECIMAL(19,2) NOT NULL,
`total_price` DECIMAL(19,2) NOT NULL,
PRIMARY KEY(orderLineId),
KEY `FK_orders_orders` (`orderId`),
CONSTRAINT `FK_orders_orders` FOREIGN KEY(`orderId`) REFERENCES `orders`(`id`),
KEY `FK_orders_products`(`product_id`),
CONSTRAINT `FK_orders_products` FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
);

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您似乎错误地创建了地图。您只需要具有外键映射的双向一对多。试试这个:

public class Order{
    @Id  
    @GeneratedValue  
    @Column(name="id")  
    private int id;

    @OneToMany(mappedBy = "order")
    private Set<OrderLine> orderLines;
}

public class OrderLine{
    @Id  
    @GeneratedValue  
    @Column(name="orderLineId") 
    private int orderLineId;

    @ManyToOne
    @JoinColumn(name = "orderId")
    private Order order;
}

你的设计实在太复杂了。您已在OrderLine表上拥有外键,因此为什么不使用它而不是为此映射指定2个不同的连接表。上面的代码应该是一个双向的一对多映射。

另外,作为附注,不要让OrderLines的PK成为Order和Product Id的组合,只需给它自己的ID列。它会让你的生活变得更轻松。

相关问题