2015-04-20 90 views
0

在我的Java学校项目中,我拥有包含房间的建筑物。每栋建筑可以有相同的房间(结构/材料),但大小不同。每个房间都有特定的设置,不包括大小。如何使用Java Hibernate向连接表添加额外信息?

目前Hibernate生成一个表“buildings_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 

在上面的例子中,一个大楼有2间客房,大小相同,但第二建筑包含完全相同的房间,但其尺寸较大。

然后当我想要检索建筑物的总大小时,我可以简单地从该表中获取房间大小的总和。

(请原谅我的术语,如“连接表”,我不知道什么是这里的正确的术语,因为我对数据库中的知识是有限的。)

我的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); 
    } 
} 

房:

@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(); 

... 

但是,当然,这将无法正常工作呢,因为大小不保存在某个地方呢。

+0

我对你的数据库架构混乱共享设置。单个房间怎么能在一个以上的建筑物中? –

+0

@IanMcLaird,它更像是一个房间类型,它指定了材料等,但没有大小。 – Rookie

+0

但是,然后建筑物应该参考房间本身(其具有类型和大小),而不是房间类型。我建议你的问题的根本原因是你的数据库没有足够的标准化。 –

回答

4

由于连接表是不是一个连接表了,但包含附加的功能信息,你只需要把它映射为一个实体:

  • 建有客房一个一对多
  • 房有大小,并与大厦有多对一,并与RoomSettings
  • RoomSettings一个多对一包含由几个房间
相关问题