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();
...
但是,当然,这将无法正常工作呢,因为大小不保存在某个地方呢。
我对你的数据库架构混乱共享设置。单个房间怎么能在一个以上的建筑物中? –
@IanMcLaird,它更像是一个房间类型,它指定了材料等,但没有大小。 – Rookie
但是,然后建筑物应该参考房间本身(其具有类型和大小),而不是房间类型。我建议你的问题的根本原因是你的数据库没有足够的标准化。 –