2015-04-20 117 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一個多對一包含由幾個房間
相關問題