У меня проблема при попытке получить все объекты «Скидка», хранящиеся в моем приложении.«Скидка» - это объект, представленный следующим классом
@Entity
@NoArgsConstructor
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "store")
public class Discount {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// some fields like a description or a percentage providing info about a discount
@ManyToOne
@JoinColumn(name = "id_store")
private Store store;
@ManyToOne
@JoinColumn(name = "id_brand")
@JsonManagedReference
private Brand brand;
// getters, setters, equals and hashcode overriden below
Как видите, объект Скидка может принадлежать магазину или торговой марке.Я гарантирую, что в моем коде и в моей базе данных установлено только одно поле с триггером.В моем приложении скидка может быть предоставлена как брендом (поэтому мне не нужно создавать скидку для каждого магазина этой марки), так и конкретный магазин может предоставить свою собственную скидку.Мой классный магазин выглядит так:
@Entity
@NoArgsConstructor
public class Store extends Entite {
@OneToMany(mappedBy = "store", cascade = CascadeType.ALL)
private Set<Discount> discounts;
@ManyToOne
@JoinColumn(name = "id_brand", nullable = false)
private Brand brand;
// getters, setters, equals and hashcode overriden below
Как видите, у магазина есть набор скидок и он принадлежит бренду.Это расширяет класс Entite, потому что в моем приложении у меня также есть Спортивные клубы, и они делятся некоторой информацией, но это не имеет отношения к моей проблеме.Наконец, вот класс Брэндов
@Entity
@NoArgsConstructor
public class Brand {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "brand", cascade = CascadeType.ALL)
private Set<Store> stores;
@OneToMany(mappedBy = "brand", cascade = CascadeType.ALL)
@JsonBackReference
private Set<Discount> discounts;
// getters, setters, equals and hashcode overriden below
Мой класс Брэндов, затем есть Набор Магазина и Набор Скидок.
Моя проблема в том, что я не могу получить все Скидкис простым FindAll из моего interface DiscountRepository
, расширяющим JpaRepository<Discount, Long>
, потому что некоторые из Discount извлекаются в рамках ассоциации.Ответ, который я получаю от метода FindAll, следующий:
[
{
// discount fields such as percentage, ruling, etc
"store": {
"id": 75,
"name": "Nike Store",
"discounts": [
75
],
"brand": {
"name": "Nike",
"store": [
75
]
}
},
"brand": null
},
{
// discount fields such as percentage, ruling, etc
"store": null,
"brand": {
"name": "Uniqlo",
"stores": [
90
]
}
},
{
// discount fields such as percentage, ruling, etc
"store": null,
"brand": {
"name": "FNAC",
"stores": [
{
"id": 76,
// some store fields
// problem here because Discount are retrieved here and therefore not displayed in the list, only here
"discounts": [
{
// discount fields such as percentage, ruling, etc
// for an offer that isn't present in the original list returned
// by the find all method but only here, associated to this Store object
"store": 76,
"brand": null
}
],
"brand": {
"name": "FNAC",
"stores": [
76
]
}
}
]
}
},
76
]
Проблема здесь в том, что есть выборка Discount с Store, и поэтому эта скидка отсутствует в исходном списке, который возвращает метод, нов объекте Store, связанном со скидкой.Я пытался добавить FetchType.LAZY
в свою ассоциацию Store and Discount, но это не решило проблему.Следовательно, есть ли способ получить «только одноуровневую ассоциацию»?Я имею в виду, что я хотел бы получить свой объект Discount, но только с информацией о бренде и магазине, а не с магазином или брендом и всеми его ассоциациями (например, набором скидок).Я надеюсь, что я был ясен, не стесняйтесь задавать мне любые вопросы.