JPA / Spring MVC Rest API - отношение один ко многим в одной и той же сущности - PullRequest
0 голосов
/ 16 ноября 2018

Я начал 2 дня назад использовать Spring MVC, и у меня возникли некоторые проблемы с практическим примером. Я создал базовую таблицу категорий (category_id относится к идентификатору категории):

DROP TABLE IF EXISTS `categories`;
CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL,
  `category_id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_CATEGORY_CATEGORY` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `categories`
  ADD CONSTRAINT `FK_CATEGORY_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`);

Теперь моя задача - отобразить полный список категорий со своими детьми, если они существуют ...

У меня в контроллере есть этот метод, который возвращает список в JSON:

@GetMapping(path="/categories", produces= {"application/json"})
    public List<Category> getAllCategories(Model model) {
        return categoryRepository.findAll();
}

Рекомендуется сделать это:

public class Category implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;

    @ManyToOne
    private Category parentCategory;

    @OneToMany(mappedBy="parentCategory", fetch = FetchType.EAGER)
    private List<Category> childCategories;


    ... default constructor, getters & setter etc.
}

При попытке просмотра страницы я вижу категории, но не показываю, есть ли у них подкатегории или нет .... Например, эта категория должна давать список дочерних категорий ... Например, я должен иметь в дочерние категории: id = 5, name = ... и т. д., id = 6, id = 7 ...

{
    "id": 1,
    "name": "XXX",
    "createdat": 1541872732000,
    "updatedat": 1541872732000,
    "parentCategory": null,
    "childCategories": [

    ]
 ....
}

и эта категория, у которой есть родительская категория, не возвращает родителя, тогда как значение parentCategory должно быть 1:

  {
    "id": 14,
    "name": "xxxxxx",
    "createdat": 1541873447000,
    "updatedat": 1541873447000,
    "parentCategory": null,
    "childCategories": [

    ]
 ....
}

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 17 ноября 2018

Вот решение, которое я нашел:

@Entity
@Table(name="categories")
@NamedQuery(name="Category.findAll", query="SELECT c FROM Category c")
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name="name")
    private String name;

    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="category_id")
    @JsonBackReference
    private Category parentCategory;

    @OneToMany(mappedBy="parentCategory", fetch = FetchType.EAGER)
    @JsonManagedReference
    private List<Category> childCategory;

    public Category() {
    }

    public Category(String name) {
        this.name = name;
    }
    // getters & setters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...