У меня очень сложная ситуация, и все же ситуация очень сложная и трудно найти аналогичный случай в 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.
У кого-нибудь есть подобный опыт?