第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

休眠多個@OneToMany 關系在父關系中生成更多結果

休眠多個@OneToMany 關系在父關系中生成更多結果

森林海 2023-06-21 13:28:23
我將從結果開始。在下一張圖片中,我將顯示 company.userAccount 的結果內容。在數據庫中,我只有兩家公司分配給同一個用戶,其中一家公司有 7 項服務。@Entity@Table(name = "user_account")@Data@Introspected@JsonIgnoreProperties(value = {"id"})public class UserAccount {    ...    @OneToMany(mappedBy = "userAccount", fetch = FetchType.EAGER)    private List<Company> companies = new ArrayList<>();}@Entity@Table(name = "company")@Data@Introspected@ToString(exclude = {"userAccount"})@JsonIgnoreProperties(value = {"id", "userAccount"})public class Company {    ...    @ManyToOne(optional = false)    @JoinColumn(name = "user_account_id", updatable = false, nullable = false)    private UserAccount userAccount;}@Entity@Table(name = "service")@Data@Introspected@ToString(exclude = {"company"})@JsonIgnoreProperties(value= {"id", "company"})public class Service {    ...    @ManyToOne(optional = false)    @JoinColumn(name = "company_id", updatable = false, nullable = false)    private Company company;}@Transactionalpublic Service saveService(@Valid @Uuid UUID companyUuid, SaveServiceCommand command) {    Company company = companyRepository.getCompanyByUuid(companyUuid).orElseThrow(() -> new NoSuchElementException("unrecognized company"));    Service service = new Service();    service.setCompany(company);    service.setName(command.getName());    service.setUuid(UUID.randomUUID().toString());    return companyRepository.saveCompanyService(service);}@Transactionalpublic Service saveCompanyService(@Valid Service service) {    entityManager.persist(service);    return service;}生成的查詢(簡化)是select * from user_account a left outer join company c on a.id=c.user_account_id left outer join service s on c.id=s.company_id; 這將產生預期結果:我期望在 UserAccount 中只看到 2 家公司,其中一家公司有 6 項服務。為什么我會有這個結果?為什么同一個公司對象多次出現在列表中?我怎樣才能避免這種情況?我相信一種解決方案是將 @OneToMany 關系的獲取類型更改為 LAZY (因為它們是默認的)(已經測試了該解決方案并且它有效),但是如果我需要這種類型的場景怎么辦?
查看完整描述

1 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

是的,有兩家公司,就像你說的那樣。您可以注意到,所有對象都是相同的(哈希值匹配)。其背后的原因是該查詢?yōu)橐患夜旧?6 行,并且PersistenceBaghibernate 使用的查詢默認情況下不會刪除重復項。傳遞distinct給你的 sql 是行不通的,因為只有一個父實體。

但這可以通過使用hibernate的查詢提示來實現。傳遞QueryHints.HINT_PASS_DISTINCT_THROUGH給 yourQuery只是刪除重復的子項。

查看完整回答
反對 回復 2023-06-21
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號