Java hibernate-多对一对同一实体列

Java hibernate-多对一对同一实体列,java,spring,hibernate,Java,Spring,Hibernate,我在建筑和楼层之间有一种关系:有些楼层只能在一栋建筑中(这些楼层只有一个外键指向“building”表),有些楼层位于两栋建筑之间(这些楼层有两个外键指向“building”表,一个是startBuildingId,另一个是endBuildingId).我有此代码来表示此关系: public class Building implements Serializable { private static final long serialVersionUID = 1L; @Id

我在建筑和楼层之间有一种关系:有些楼层只能在一栋建筑中(这些楼层只有一个外键指向“building”表),有些楼层位于两栋建筑之间(这些楼层有两个外键指向“building”表,一个是
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;
}
公共类构建实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@OneToMany(mappedBy=“建筑”)
private Set floors=new HashSet();
}
公共类楼层实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多酮
@JsonIgnoreProperties(“楼层”)
@JoinColumn(name=“building\u id”)
私人楼宇;;
@许多酮
@JsonIgnoreProperties(“”)
@JoinColumn(name=“开始建筑\u id”)
私人楼宇startBuildingId;
@许多酮
@JsonIgnoreProperties(“”)
@JoinColumn(name=“end\u building\u id”)
私人楼宇endBuildingId;
}
当我创建一个位于两栋建筑之间的楼层时,我选择了
startBuildingId
endBuildingId
,但是当我从建筑的
私有设置楼层中检索所有楼层时,它只显示其他楼层,而不是位于两栋建筑之间的楼层。我如何才能做到这一点?

我的建议:

  • 三个@OneToMany字段
  • 返回它们的并集的方法
我假设您没有对楼层列表进行任何修改(添加楼层的定义不明确-它属于单个建筑还是共享)。在这种情况下,它可以是实际集合上的惰性、不可修改的视图

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

我的建议:

  • 三个@OneToMany字段
  • 返回它们的并集的方法
我假设您没有对楼层列表进行任何修改(添加楼层的定义不明确-它属于单个建筑还是共享)。在这种情况下,它可以是实际集合上的惰性、不可修改的视图


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

这个答案有用吗?->这个答案有用吗?->所以这里使用双向一对多是正确的?因为我的代码错了,我认为我应该使用多对多的方法来使用你需要使用的东西,一对多是一个领域建模决策,而不是技术细节。我提出的两种方法都适用于多对多。谢谢,我认为一对多和多对多映射到数据库中的关系,您能否建议有关此主题的任何关键字。这两种方法都映射到数据库中的关系,但实现方式通常不同。对于多对多,您需要一个联接表。对于集合元素具有唯一约束的一对多联接表,但更高效的映射仅在集合元素中使用外键。除了公平性,还有其他考虑因素。对于一对多,集合元素的生存期绑定到父元素,因此,例如,可以级联删除。这不是多对多的情况。所以这里使用双向一对多是正确的吗?因为我的代码错了,我认为我应该使用多对多的方法来使用你需要使用的东西,一对多是一个领域建模决策,而不是技术细节。我提出的两种方法都适用于多对多。谢谢,我认为一对多和多对多映射到数据库中的关系,您能否建议有关此主题的任何关键字。这两种方法都映射到数据库中的关系,但实现方式通常不同。对于多对多,您需要一个联接表。对于集合元素具有唯一约束的一对多联接表,但更高效的映射仅在集合元素中使用外键。除了公平性,还有其他考虑因素。对于一对多,集合元素的生存期绑定到父元素,因此,例如,可以级联删除。这不是多对多的情况。