Hibernate не включает дочерние сущности того же типа, что и сущность, в список другой сущности - PullRequest
3 голосов
/ 26 мая 2020

У меня есть две сущности, Menu и MenuItem, как показано в исходном коде ниже. Я пытаюсь получить Menu со всеми дочерними объектами из базы данных, но Hibernate также вставляет дочерние объекты MenuItem в список nodes объекта Menu.

Menu. java

[...]

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "menu", cascade = CascadeType.ALL, orphanRemoval = true)
    @OrderBy("order ASC")
    private List<MenuItem> nodes = new ArrayList<MenuItem>();
[...]

MenuItem. java

[...]

    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "parentId")
    private MenuItem parentItem;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parentItem", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<MenuItem> children = new ArrayList<MenuItem>();

    @ManyToOne(optional = false)
    @JoinColumn(name = "menuId")
    private Menu menu;
[...]

В качестве подсказки: я знаю, что вы не должны использовать FetchType.EAGER для коллекций, но поскольку мне нужны все элементы коллекций, их полезно загружать, когда загружено Меню. Без списков меню не будет.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Только элементы меню, которые должны быть прямыми потомками Menu, должны иметь поле menu, иначе все они будут извлечены в коллекцию nodes из-за mappedBy = "menu".

Кстати, поскольку ваш вариант использования типа выборки EAGER кажется оправданным, вам не следует использовать выборку EAGER в целом, а не только для коллекций. Это хорошее чтение про топи c.

0 голосов
/ 05 июня 2020

CascadeType.ALL будет распространять (каскадно) все операции EntityManager на связанные сущности.

Попробуйте удалить cascade = CascadeType.ALL из отношения.

По умолчанию никакие операции не выполняются каскадом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...