Репозиторий JPA - Получение дубликатов в Списке, вызванных объединениями таблиц - PullRequest
0 голосов
/ 13 января 2020

У меня очень сложная ситуация, и все же ситуация очень сложная и трудно найти аналогичный случай в stackoverflow.

У меня есть следующие объекты

Store

@Data
@Entity
@Table(name = "store")
public class Store implements IModel {

  @Id
  @EqualsAndHashCode.Exclude
  @GeneratedValue(strategy = GenerationType.AUTO)
  private UUID id;

  @Enumerated(EnumType.STRING)
  @Column(name = "storestatus", nullable = false)
  private StoreStatus storeStatus = StoreStatus.UNKNOWN;

  @OneToOne
  @JoinColumn(name = "storetypecode_id")
  private StoreTypeCode storeTypeCode;

  @OneToOne(cascade = CascadeType.ALL, mappedBy = "store")
  private Address address;

  @Setter(AccessLevel.NONE)
  @EqualsAndHashCode.Exclude
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "store")
  private Set<StoreTranslation> storeTranslationList = new HashSet<>();

  public Store() {

  }

StoreTypeCode

@Data
@Entity
@Table(name = "storetypecode")
public class StoreTypeCode implements IModel {

  @Id
  @EqualsAndHashCode.Exclude
  @GeneratedValue(strategy = GenerationType.AUTO)
  private UUID id;

  @Column(name = "displaysort", nullable = false)
  private Integer displaySort = 999;

  @Setter(AccessLevel.NONE)
  @EqualsAndHashCode.Exclude
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "storeTypeCode")
  private Set<StoreTypeCodeTranslation> storeTypeCodeTranslationList = new HashSet<>();


  public StoreTypeCode() {
  }

}

И StoreCategory


@Data
@Entity
@Table(name = "storeitemcategory")
public class StoreItemCategory implements IModel {

  @Id
  @EqualsAndHashCode.Exclude
  @GeneratedValue(strategy = GenerationType.AUTO)
  private UUID id;

  @ManyToOne
  @JoinColumn(name = "store_id")
  private Store store;

  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(
      name = "storeitemcategory_storeitem",
      joinColumns = {@JoinColumn(name = "storeitemcategory_id", referencedColumnName = "id")},
      inverseJoinColumns = {@JoinColumn(name = "storeitem_id", referencedColumnName = "id")})
  private List<StoreItem> storeItems = new ArrayList<>();

  @Setter(AccessLevel.NONE)
  @EqualsAndHashCode.Exclude
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "storeItemCategory")
  private Set<StoreItemCategoryTranslation> storeItemCategoryTranslationList = new HashSet<>();



  public StoreItemCategory() {
  }


  public void addStoreItem(StoreItem storeItem) {
    this.storeItems.add(storeItem);
  }
}

С указанным выше отношением вот что у меня есть.

Store A с storeTypeCode ("Cafe") и storeItemCategory ("Замороженные напитки") StoreTypeCode имеет два перевода: 1) для английского языка sh, 2) для китайского.

Когда я добавляю элемент для storeItems в StoreItemCategory, я получаю дубликаты в списке. (И несколько дублированных записей вставляются в таблицу storeitemcategory_storeitem.)

      StoreItemCategory sic = storeItemCategoryRepository.findById(storeItemCategoryid).get();
      sic.addStoreItem(new StoreItem(...));
      sic = storeItemCategoryRepository.save(sic);

Я подозреваю, что это как-то связано с объединением таблиц для переводов, потому что когда я запускаю запрос, созданный из Spring, для получения StoreItemCategory , Я получаю несколько записей StoreItemCategory (одну для Engli sh и одну для китайского из StoreTypeCode).

select
       *
    from
        storeitemcategory storeitemc0_
    left outer join
        store store1_
            on storeitemc0_.store_id=store1_.id
    left outer join
        storetranslation storetrans2_
            on store1_.id=storetrans2_.store_id
    left outer join
        storetypecode storetypec3_
            on store1_.storetypecode_id=storetypec3_.id
    left outer join
        storetypecodetranslation storetypec4_
            on storetypec3_.id=storetypec4_.storetypecode_id
    left outer join
        address address5_
            on store1_.id=address5_.store_id
    left outer join
        storeitemcategorytranslation storeitemc6_
            on storeitemc0_.id=storeitemc6_.storeitemcategory_id
    left outer join
        storeitemcategory_storeitem storeitems7_
            on storeitemc0_.id=storeitems7_.storeitemcategory_id
    left outer join
        storeitem storeitem8_
            on storeitems7_.storeitem_id=storeitem8_.id
    left outer join
        store store9_
            on storeitem8_.store_id=store9_.id
    left outer join
        storeitemtranslation storeitemt10_
            on storeitem8_.id=storeitemt10_.storeitem_id
    where
        storeitemc0_.id=?

Все мои таблицы будут иметь таблицы переводов, и я не уверен, как обойти это без использования set.

У кого-нибудь есть подобный опыт?

...