如何使用JavaHibernate向联接表添加额外信息?

如何使用JavaHibernate向联接表添加额外信息?,java,mysql,hibernate,Java,Mysql,Hibernate,在我的Java学校项目中,我有包含房间的建筑物。每个建筑可以有相同的房间(结构/材料),但大小不同。每个房间都存储在自己的桌子上,有特定的设置,不包括大小 目前,Hibernate会生成一个表“buildings\u rooms”,以告诉建筑物包含哪些房间。数据如下所示: building_id room_id 1 4 1 5 2 4 2 5 问题是:如何在其中添加一个新的列“大小”,以便可以分

在我的Java学校项目中,我有包含房间的建筑物。每个建筑可以有相同的房间(结构/材料),但大小不同。每个房间都存储在自己的桌子上,有特定的设置,不包括大小

目前,Hibernate会生成一个表“buildings\u rooms”,以告诉建筑物包含哪些房间。数据如下所示:

building_id   room_id
1             4
1             5
2             4
2             5
问题是:如何在其中添加一个新的列“大小”,以便可以分别定义每个房间,使其具有不同建筑房间的不同大小

然后它应该看起来像:

building_id   room_id   size
1             4         15
1             5         15
2             4         20
2             5         20
在上面的示例中,一个建筑包含两个大小相同的房间,但第二个建筑包含完全相同但大小更大的房间

之后,当我想要检索建筑的总尺寸时,我可以简单地从该表中获取房间尺寸的总和

(请原谅使用“联接表”等术语,由于我对数据库的了解有限,我不确定这里的正确术语是什么。)

我的Java代码的基本部分:

建筑:

@Entity
@Table(name="BUILDING")
public class Building {
    private int building_id;
    private String building_name;
    private Set<Room> rooms = new HashSet<Room>();

    ...

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="buildings_rooms",
        joinColumns={@JoinColumn(name="building_id")},
        inverseJoinColumns={@JoinColumn(name="room_id")}
    )
    public Set<Room> getRooms() {
        return rooms;
    }

    ...

    public void addRoom(Room room){
        rooms.add(room);
        room.getBuildings().add(this);
    }
}

但是,这当然还不能正常工作,因为大小还没有存储在任何位置。

由于联接表不再是联接表,而是包含附加的功能信息,您只需要将其映射为一个实体:

  • 这座大楼有一个带房间的办公室
  • 房间有一个大小,一个带建筑物的多人房间,一个带房间设置的多人房间
  • RoomSettings包含多个房间共享的设置

由于联接表不再是联接表,而是包含附加的功能信息,因此您只需将其映射为一个实体:

  • 这座大楼有一个带房间的办公室
  • 房间有一个大小,一个带建筑物的多人房间,一个带房间设置的多人房间
  • RoomSettings包含多个房间共享的设置

我被您的数据库模式弄糊涂了。一个房间怎么可能位于多个建筑中?@IanMcLaird,它更像是一个房间类型,它指定了材料等,而不是大小。但是建筑应该指房间本身(有类型和大小),而不是房间类型。我建议您的问题的根本原因是您的数据库没有充分规范化。这基本上是JB Nizet的回答所说的。我对您的数据库模式感到困惑。一个房间怎么可能位于多个建筑中?@IanMcLaird,它更像是一个房间类型,它指定了材料等,而不是大小。但是建筑应该指房间本身(有类型和大小),而不是房间类型。我认为您的问题的根本原因是您的数据库没有得到充分的规范化。这基本上就是JB Nizet的答案所说的。
@Entity
@Table(name="ROOM")
@Inheritance(strategy=InheritanceType.JOINED)
public class Room {
    private int room_id;
    private String room_name;
    //private double room_size; // how to handle this? cannot store it in the Room table!
    private Set<Building> buildings = new HashSet<Building>();

    public Room(String room_name, double room_size) {
        this.room_name = room_name;
        //this.room_size = room_size; // how to handle this? cannot store it in the Room table!
    }

    @ManyToMany(mappedBy="rooms")
    public Set<Building> getBuildings() {
        return buildings;
    }

    ...
}
...

    transaction = session.beginTransaction();

    Building b1 = new Building("Building1");
    Room b1r1 = new Room("Kitchen",    15.0); // 15 squaremeters in size for this building's room.
    Room b1r2 = new Room("Vestibule",  15.0);
    b1.addRoom(b1r1);
    b1.addRoom(b1r2);
    session.saveOrUpdate(b1);

    Building b2 = new Building("Building2");
    Room b2r1 = new Room("Kitchen",    20.0); // 20 squaremeters in size for this building's room.
    Room b2r2 = new Room("Vestibule",  20.0);
    b2.addRoom(b2r1);
    b2.addRoom(b2r2);
    session.saveOrUpdate(b2);

    transaction.commit();

...