JPA извлекает только одноуровневую ассоциацию - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблема при попытке получить все объекты «Скидка», хранящиеся в моем приложении.«Скидка» - это объект, представленный следующим классом

@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, но только с информацией о бренде и магазине, а не с магазином или брендом и всеми его ассоциациями (например, набором скидок).Я надеюсь, что я был ясен, не стесняйтесь задавать мне любые вопросы.

...