簡體   English   中英

JPA單向ManyToMany - 檢索列表時的重復位置

[英]JPA unidirectional ManyToMany - duplicated positions in when retrieving list

我的項目中有以下實體:

  • AccountGroup
  • AccountItem
  • AccountSegment

隨着關系:

  • AccountGroup具有List<AccountItem>

  • AccountItem 具有 List<AccountSegment>

一切都很好。

當我將最后一個關系更改為:

  • AccountItem具有Set<AccountSegment>

從數據庫讀取的AccountGroup對象看起來很奇怪。 如果給定的AccountItem有三個AccountSegment ,那么我在AccountGroup有三個相同的AccountItem

來自調試器的鏡頭可能比我能說得更好: 來自調試器的SS

如您所見, accountMapperItems列表有四個位置而不是兩個。 第一對是重復的,每個都具有相同的變量。 (第二個是類似的,屏幕截圖上沒有顯示)。

下面我粘貼實體代碼片段:

class AccountGroup {
    ...
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
    private List<AccountItem> accountMapperItems;
    ....
}

class AccountItem {
    ...
    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE })
    @JoinTable(
        joinColumns={@JoinColumn(name="ACCOUNT_ITEM_ID", referencedColumnName="ID")},
        inverseJoinColumns={@JoinColumn(name="SEGMENT_ID", referencedColumnName="ID")})
    private Set<Segment> segmentSet;

    @ManyToOne
    private AccountGroup group;
    ...
}

AccountSegment沒有任何鏈接。

有誰知道為什么它retriving accountMapperItems列表每一個位置AccountSegment

問題不在於連接表中的重復條目! 我仔細檢查了一下。

更新

@Fetch (FetchMode.SELECT)

解決了這個案子,在答案中提到的帖子中有進一步的解釋。

確保所有實體都實現了hashCode()equals() 某些集合(如集合)使用這些方法來唯一標識元素。

編輯 :如果這沒有解決它,那么我認為重復項很可能是由FetchType.EAGER引起的。 這個答案解釋得很好。 嘗試刪除FetchType.EAGER以查看它是否有任何區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM