Неэффективное сохранение в спящем режиме с использованием отношения manyToMany - PullRequest
0 голосов
/ 03 июля 2019

У меня есть список из 25 объектов MyApplication, которые я хочу сохранить, используя hibernate / JPA. Это делается с помощью следующего метода:

MyApplicationRepository.saveAll(myAppList);

Однако я заметил, что hibernate создает более 60 000 объектов MyApplication (близко к общему количеству записей, уже находящихся в базе данных для этой сущности) при вставке / обновлении этого списка из 25 в базе данных. У меня нет большого опыта гибернации, который заставляет меня верить, что я создал неэффективные отношения сущностей. Часть класса MyApplication:

public class MyApplication {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "APPLICATION_CATEGORY", joinColumns = {
            @JoinColumn(name = "applicationid", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "categoryid",
                    nullable = false, updatable = false) })
    private Set<Category> categorySet;


    @OneToMany(mappedBy = "myApplication", 
                  cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Screenshot> screenshotSet;
}

Класс категории (один пример отношения множественных ко многим из MyApplication):

public class Category {
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "categorySet")
    private Set<MyApplication> myApplicationSet;
}

Класс снимка экрана:

public class Screenshot {
    @ManyToOne
    @JoinColumn(name = "applicationid")
    private MyApplication myApplication;
}

Что я сделал не так, что в результате Hibernate создал так много экземпляров MyApplication при сохранении?

Примечание 1: В конце концов вся информация MyApplication и информация о его категориях и снимках экрана правильно сохраняется в базе данных.

Примечание 2. Важно сохранить не только MyApplication, но и все из всех его категорий и снимков экрана.

1 Ответ

0 голосов
/ 06 июля 2019

Мне удалось решить проблему. Проблема была вызвана двунаправленным характером отношения manyToMany. Это привело к тому, что категория также запрашивала все приложения из базы данных перед сохранением. Поскольку это не то, что я хочу, я решил проблему, превратив ее в однонаправленное отношение, удалив myApplicationSet из класса Category. Теперь только 25 экземпляров MyApplication созданы для сохранения 25 приложений, и использование моей памяти остается стабильным.

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