我有两张桌子订单和订单。当我尝试加入两列时,我得到了这个例外。
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`)
);
请帮我解决这个问题。
答案 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列。它会让你的生活变得更轻松。