我有两节课:
Order.java:
@Entity
@Table(name = "orders", catalog = "ownDB")
public class Order {
private int orderNO;
private String oderName;
private Set<Room> rooms = new HashSet<Room>(0);
public Order(int orderNo, String orderName, Set<Room> rooms) {
this.oderNo = orderNo;
this.orderName = orderName;
this.rooms = rooms;
}
@Id
@Column(name = "orderNO", unique = true, nullable = false, length = 6)
public int getOrderNO() {
return this.orderNO;
}
public void setOrderNo(int OrderNO) {
this.orderNO = orderNO;
}
@Column(name = "orderName", nullable = false, length = 100)
public String getOrderName() {
return this.orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "rooms_orders", joinColumns = { @JoinColumn(name = "orderNO") }, inverseJoinColumns = { @JoinColumn(name = "roomNO") })
public Set<Room> getRoom() {
return this.rooms;
}
public void setRoom(Set<Room> rooms) {
this.rooms = rooms;
}
}
这是room.java:
@Entity
@Table(name = "rooms", catalog = "ownDB")
public class {
private int roomNO;
private String name;
private Set<Order> orders = new HashSet<Order>(0);
public Room(int roomNO, String name, Set<Order> orders) {
this.roomNO = roomNO;
this.name = name;
this.orders = orders;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "roomNO", unique = true, nullable = false, length = 6)
public int getRoomNO() {
return this.roomNO;
}
public void setRoomNO(int roomNO) {
this.roomNO = roomNO;
}
@Column(name = "name", nullable = false, length = 100)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "rooms_orders", joinColumns = { @JoinColumn(name = "roomNO") }, inverseJoinColumns = { @JoinColumn(name = "orderNO") })
public Set<Order> getOrders() {
return this.orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
SQL:
CREATE TABLE rooms (
roomNO int(6) NOT NULL ,
name VARCHAR(100) NOT NULL ,
PRIMARY KEY (roomNO));
CREATE TABLE orders (
orderNO int(6) NOT NULL AUTO_INCREMENT,
orderName VARCHAR(100) NOT NULL,
PRIMARY KEY (orderNO));
CREATE TABLE rooms_orders (
roomNO int(6) NOT NULL,
orderNO int (6) NOT NULL,
PRIMARY KEY (roomNO, orderNO));
这两个映射有什么问题?它对我有用。但我不想使用,如果不是正确的方法。如果我在Order类中将第二个映射更改为“@ManyToMany(mappedBy =”room“)”(没有joinTable注释)。我无法列出所有房间(及其订单),因为我收到此错误消息:
“无法懒惰地初始化角色集合:com.room.model.Room.orders,无法初始化代理 - 无会话”
什么是正确的方式可以列出他们的房间和所有房间的订单所有订单。所以我需要“双向”加入。
答案 0 :(得分:1)
您发布的代码中存在许多错误。
首先,您的连接表未正确定义。它不应该有一个单独的ID列:没有人会填充此列。它应该被定义为
CREATE TABLE rooms_orders (
roomNO int(6) NOT NULL,
orderNO int (6) NOT NULL,
PRIMARY KEY (rommNO, orderNO));
其次,你的映射是错误的。双向关联总是有一个所有者方,它定义了关联的映射方式,另一方面是反面,它使用mappedBy属性告诉JPA这是反面,以及在哪里找到所有者方。因此,在Room中,应该使用
映射关联@ManyToMany(mappedBy = "rooms")
public Set<Order> getOrders() {
return this.orders;
}
最后,您的关联映射与表格中的列名称不匹配:
@JoinTable(name = "rooms_orders",
joinColumns = { @JoinColumn(name = "orderNO") },
inverseJoinColumns = { @JoinColumn(name = "roomNumber") })
没有列&#34; roomNumber&#34;在表中。该列名为&#34; roomNO&#34;。