gpt4 book ai didi

java - 如何避免JPA一对多映射(同一模型中的两个一对多关系)中的冗余数据(列表获取)?

转载 作者:行者123 更新时间:2023-12-02 10:08:33 25 4
gpt4 key购买 nike

我有三个模型。 BookingDetail 与 LookupFoodItem 和 LookupFacility 模型具有一对多关系。在我的数据库中,有 4 个 LookupFacility 记录和 4 个 LookupFoodItem 记录。当我获取 BookingDetail 一条记录时,应该有 4 个 LookupFoodItem 记录,但我发现 16 个记录是多余的。如何解决这个问题,只获取真实记录而不是冗余数据?

public class BookingDetail {
@OneToMany(mappedBy = "bookingDetail", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<LookupFacility> lookupFacilities;
@OneToMany(mappedBy = "bookingDetail", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public List<LookupFoodItem> lookupFoodItems;
}

public class LookupFacility {
@ManyToOne
@JoinColumn(name="booking_details_id")
BookingDetail bookingDetail;
}

public class LookupFoodItem{
@ManyToOne
@JoinColumn(name="booking_details_id")
BookingDetail bookingDetail;
}

当我使用 JPA 从数据库中获取 BookingDetail 信息时,它会给我这样的冗余数据

LookupFoodItem{id=40, name='Beef ', price=120.0}
LookupFoodItem{id=41, name='Polao', price=300.0}
LookupFoodItem{id=42, name='Crab Fry', price=299.0}
LookupFoodItem{id=43, name='Chicken Soup', price=100.0}
LookupFoodItem{id=40, name='Beef ', price=120.0}
LookupFoodItem{id=41, name='Polao', price=300.0}
LookupFoodItem{id=42, name='Crab Fry', price=299.0}
LookupFoodItem{id=43, name='Chicken Soup', price=100.0}
LookupFoodItem{id=40, name='Beef ', price=120.0}
LookupFoodItem{id=41, name='Polao', price=300.0}
LookupFoodItem{id=42, name='Crab Fry', price=299.0}
LookupFoodItem{id=43, name='Chicken Soup', price=100.0}
LookupFoodItem{id=40, name='Beef ', price=120.0}
LookupFoodItem{id=41, name='Polao', price=300.0}
LookupFoodItem{id=42, name='Crab Fry', price=299.0}
LookupFoodItem{id=43, name='Chicken Soup', price=100.0}

LookupFoodItem 和 LookupFacilities 之间没有关系。

最佳答案

不确定您是否正在使用 LOMBOK 或者实际上缺少 getter 和 setter,所以我将其添加到此处。

使用 Set 代替 List,并将获取更改为 Lazy。这是我的工作解决方案之一。希望这会有所帮助。

请根据需要随意更改注释了解更多详细信息this有一些信息

public class BookingDetail {
private Set<LookupFacility> lookupFacilities = new HashSet<LookupFacility>();
private Set<LookupFoodItem> lookupFoodItems = new HashSet<LookupFoodItem>();
@OneToMany(fetch = FetchType.LAZY, mappedBy = "bookingDetail", cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
public Set<LookupFacility> getLookupFacilities() {
return lookupFacilities;
}

public void setLookupFacilities(final Set<LookupFacility> lookupFacilities) {
this.lookupFacilities = lookupFacilities;
}


@OneToMany(fetch = FetchType.LAZY, mappedBy = "bookingDetail", cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
public Set<LookupFoodItem> getLookupFoodItems() {
return lookupFoodItems;
}

public void setLookupFoodItems(final Set<LookupFoodItem> lookupFoodItems) {
this.lookupFoodItems = lookupFoodItems;
}
}

对于类 LookupFacilityLookupFoodItem 我们这个

private BookingDetail  bookingDetail;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "booking_details_id")
public BookingDetail getBookingDetail() {
return bookingDetail;
}

public void setBookingDetail(BookingDetail bookingDetail) {
this.bookingDetail = bookingDetail;
}

关于java - 如何避免JPA一对多映射(同一模型中的两个一对多关系)中的冗余数据(列表获取)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com