我正在努力开发一个管理宿舍的系统。由于我对数据库没有太多经验,所以我遇到了问题并且我有一个解决方案,但我不确定这是否是正确的方法。 所以我有房间和用户。每个用户可以容纳在一个房间中,但是一个房间可以容纳更多用户。我想在一个实体中管理这种关系 - 住宿。在这里,我会有更多的属性,比如开始/结束日期等。
我正在使用Hibernate映射表。从我读过的内容来看,Java中的持久化集合可以通过两种方式完成,可以是@OneToMany,也可以是@ElementCollection。我不太确定我是否应该在Room实体或住宿实体中定义这种关系?如果我在房间实体中这样做,那么住宿将从房间/用户桌面只保留fk? 此外,是否可以仅在执行一对多关系而不是获取整个对象时获取主键?我知道FETCH.LAZY会这样做,但在我的住宿实体中,理想情况下我只想存储Set studentsIds。
提前谢谢。
@Table(name = "student")
@AllArgsConstructor
@Data
@Embeddable
@NoArgsConstructor
@javax.persistence.Entity
public class Student implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "role")
private String role;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "room", nullable = false)
private Room room_number;
}
这是Room实体
@javax.persistence.Entity
@Table(name = "room")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Data
public class Room
{
@Id
@Column(name = "room_number")
private Long roomNumber;
@Column(name = "location_address")
private String locationAddress;
@Column(name = "dormitory_name")
private String dormitoryName;
}
住宿实体
@javax.persistence.Entity
@Table(name = "accommodation")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Data
public class Accommodation extends Entity {
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "room_number")
private Room room_number;
@OneToMany(mappedBy = "room_number", // I am not sure about this
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
orphanRemoval = true) private List<Student> students;
@Column(name = "date_from")
private Date dateFrom;
@Column(name = "date_to")
private Date dateTo;
}