在单独的表中映射一对多关系

时间:2017-12-21 16:39:09

标签: java mysql hibernate spring-boot

我正在努力开发一个管理宿舍的系统。由于我对数据库没有太多经验,所以我遇到了问题并且我有一个解决方案,但我不确定这是否是正确的方法。 所以我有房间和用户。每个用户可以容纳在一个房间中,但是一个房间可以容纳更多用户。我想在一个实体中管理这种关系 - 住宿。在这里,我会有更多的属性,比如开始/结束日期等。

我正在使用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;
}

0 个答案:

没有答案