所以我有一个叫做建筑的实体和另一个叫做建筑单位的实体之间的关系。一座建筑可以有很多建筑单元。所以一个标准的一对多的关系。我面临的问题是,建筑单元的每个实体都被加载了16次,而不是预期的一个。
public class Building {
@OneToMany(mappedBy = "building",fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JsonManagedReference //<- without this an endless recursion would appear
private List<buildingUnit> buldingUnits;
}
public class buildingUnit{
@ManyToOne()
@JoinColumn(name = "building_id, nullable = false)
@JsonBackReference
private Building building
}
建筑物也与不同的阶级有关系,建筑单位也与不同的阶级有更多的关系,但我不认为他们会产生这种行为。我闭口不谈,在数据库中,一切都是正确存储的。每个建筑单元只存储一次,并有一个建筑物的锻造钥匙.所以这个问题必须来自于代码。
我的实体之间的关系有点像这样:
BuildingUnit ->
Building -> Room -> Wall
VentilationZone ->
建筑单元和通风区域可以有不同的房间。
从DB加载建筑物时的结果:
Building:
buildingUnit: [u1, u1, u1, u1, u1,..., u2, u2, u2, u2,...]
我使用的DB是一个SQLite DB
发布于 2022-04-26 11:28:26
我不确定您是否发布了整个代码,但我认为您缺少@Entity
和@Id
。如以下示例所示:
@Entity
public class Building {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
...
如果它没有解决问题,那么实现equals
和hashcode
方法可能是值得的。
发布于 2022-04-27 21:13:08
也许是因为您的建筑实体中的其他集合被急切地获取,这将导致笛卡儿产品的双重左外连接。
发布于 2022-04-26 12:18:53
工作范围:
我找不到解决这个问题的办法,但我找到了一个解决办法,可以删除所有重复的内容。在加载建筑物的仓库中,我运行一个简短的函数,删除所有重复的对象:
private void removeDubplicates(Building building){
building.setBuildingUnits(
building.getBuildingUnits.stream()
.distinct()
.collect(Collectors.ToList())
);
}
我认为这是因为列表中的每个重复都是同一个对象(o1 == o2)。
https://stackoverflow.com/questions/72012981
复制相似问题