В двунаправленном отображении ManyToMany findAll () получает строки, каждая из которых содержит свои дочерние элементы, которые, в свою очередь, содержат себя - PullRequest
0 голосов
/ 02 июня 2019

У меня есть модель данных с двунаправленным отображением ManyToMany следующим образом.

Продукт может иметь несколько категорий, аналогично категории могут иметь несколько продуктов.Я использую таблицу ссылок для поддержания отношения.

Сущность «Категории» определяется следующим образом:

@Entity(name = "categories")
class Categories(
        @Id
        @GeneratedValue
        @Column(name="cat_id", unique = true, nullable = false)
        var id: Integer,
        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "categories_product", joinColumns = [JoinColumn(name = "cat_id")], inverseJoinColumns = [JoinColumn(name = "prd_id")])
        @JsonIgnoreProperties("productsSet")
        var productsSet: MutableSet<Products>
)

А сущность «Продукты» имеет список в виде обратного отображения в виде:

@Entity(name = "products")
class Products(
        @Id
        @GeneratedValue
        @Column(name="prd_id", unique = true, nullable = false)
        var id: Integer,
        @ManyToMany(fetch = FetchType.LAZY, mappedBy = "productsSet")
        @JsonIgnoreProperties("productsSet")
        var categories: MutableSet<Categories>
)

Моя таблица сопоставления 'category_product' имеет два столбца 'cat_id' и 'prd_id', которые ссылаются на таблицы 'category' и 'products' соответственно.

У меня есть ProductsRepository и CategoriesRepository, которыереализует CrudRepository.

Вызов findAll () со стороны mappedBy, которая является ProductsRepository, работает нормально, как показано ниже:

[
   {
      "id":1,
      "name":"Cricket Bat",
      "price":10.0,
      "categories":[
         {
            "id":1,
            "name":"Sports",
            "description":"Sports items"
         }
      ]
   },
   {
      "id":2,
      "name":"Spring Boot",
      "price":100.0,
      "categories":[
         {
            "id":2,
            "name":"Books",
            "description":"Book items"
         }
      ]
   }
]

Однако, вызов findAll () со стороны-владельца, которой является Categories, возвращает все своипродукты, которые также содержат ссылки на категории, как показано ниже:

[
   {
      "id":1,
      "name":"Sports",
      "description":"Sports items",
      "productsSet":[
         {
            "id":1,
            "name":"Cricket Bat",
            "price":10.0,
            "categories":[
               {
                  "id":1,
                  "name":"Sports",
                  "description":"Sports items"
               }
            ]
         }
      ]
   },
   {
      "id":2,
      "name":"Books",
      "description":"Book items",
      "productsSet":[
         {
            "id":2,
            "name":"Spring Boot",
            "price":100.0,
            "categories":[
               {
                  "id":2,
                  "name":"Books",
                  "description":"Book items"
               }
            ]
         }
      ]
   }
]

Как сделать так, чтобы findAll () со стороны владельца (CategoriesRepository) возвращал только его дочерние элементы, а не дочерние, как на стороне отображения (ProductsRepository)

1 Ответ

0 голосов
/ 04 июня 2019

В интересах других, я перечисляю решение, данное @JBNizet в комментариях.Спасибо, JB Nizet!

При использовании @ManyToMany нецелесообразно включать @JsonIgnoreProperties, чтобы избежать исключения StackOverFlow из-за рекурсивной выборки записей.

Так что определяйте @JsonIgnoreProperties на стороне владельца, чтобы игнорироватьДочерний элемент выглядит следующим образом:

@ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "categories_product", joinColumns = [JoinColumn(name = "cat_id")], inverseJoinColumns = [JoinColumn(name = "prd_id")])
        @JsonIgnoreProperties("categories")
        var productsSet: MutableSet<Products>

И определяем @JsonIgnoreProperties на стороне сопоставления, чтобы игнорировать родительский элемент следующим образом:

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "productsSet")
        @JsonIgnoreProperties("productsSet")
        var categories: MutableSet<Categories>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...