首页 > 解决方案 > hibernate - 多对一到同一实体列

问题描述

我有建筑物和楼层之间的关系:有些楼层只能在 1 个建筑物中(这些楼层只有 1 个“建筑”表的外键),有些楼层位于 2 个建筑物之间(这些楼层将有 2 个外键“建筑”表,一个是startBuildingId,第二个是endBuildingId)。我有这个代码来表示这种关系:

public class Building implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "building")
    private Set<Floor> floors = new HashSet<>();
}

public class Floor implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JsonIgnoreProperties("floors")
    @JoinColumn(name = "building_id")
    private Building building;

    @ManyToOne
    @JsonIgnoreProperties("")
    @JoinColumn(name = "start_building_id")
    private Building startBuildingId;

    @ManyToOne
    @JsonIgnoreProperties("")
    @JoinColumn(name = "end_building_id")
    private Building endBuildingId;
}

当我创建位于 2 个建筑物之间的楼层时,我选择了startBuildingIdand endBuildingId,但是当我从该建筑物的 检索所有楼层时private Set<Floor> floors,它只显示其他楼层,而不是位于 2 个建筑物之间的那些楼层。我怎样才能做到这一点?

标签: javaspringhibernate

解决方案


我的建议:

  • 三个@OneToMany 字段
  • 返回它们的并集的方法

我假设您没有对楼层列表进行任何修改(添加楼层不会明确定义 - 它属于单个建筑物,还是共享)。在这种情况下,它可以是对实际集合的惰性、不可修改的视图。

或者(并且最好),您可以轻松创建一个 JPQL/Criteria 查询,该查询通过建筑物 ID 查找所有楼层。


推荐阅读