Hibernate:ManytoMany映射:“双向”

时间:2014-10-26 13:22:07

标签: java mysql spring hibernate

我有两节课:

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,无法初始化代理 - 无会话”

什么是正确的方式可以列出他们的房间和所有房间的订单所有订单。所以我需要“双向”加入。

1 个答案:

答案 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;。