Как Ленивый Загрузить объект из списков в Java JPA? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть следующие объекты: DocumentType, UserGroup, User

DocumentType.java имеет @ManyToMany Набор UserGroup:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "review_type", joinColumns = @JoinColumn(name="doc_type"),
        inverseJoinColumns = @JoinColumn(name="user_group_id") )
private Set<UserGroup> reviewUserGroups;

UserGroup.Java имеет @ManyToMany Набор пользователя:

    @ManyToMany
@JoinTable(name = "group_users", joinColumns = @JoinColumn(name = "group_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> users;

Что я хочу сделать, чтобы реализовать этот код:

    @Transactional
private void createDocuments(int avgDocsPerUser) {
    List<DocumentType> documentTypes = documentTypeRepository.findAll();
    int documentTypesCount = documentTypes.size();
    List<User> users = userRepository.findAll().stream().filter(user -> !user.isAdmin()).collect(Collectors.toList());
    int usersCount = users.size();
    int documentsToCreate = (int) Math.floor(Math.random() * (usersCount * avgDocsPerUser)) + 1;
    List<Document> documentList = new ArrayList<>();

    while (documentList.size() < documentsToCreate) {
        DocumentType documentType = documentTypes.get((int) Math.floor(Math.random() * documentTypesCount));
        User user = documentType
                .getSubmissionUserGroups()
                .stream().findAny()
                .get().getUsers()
                .stream().findAny().get();
        // create new document here and add User info to it
    }
    documentRepository.saveAll(documentList);
}

Проблема, которую я продолжаю получать ошибку:

Вызвано: org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: it.akademija.wizards.entities.DocumentType.submissionUserGroups, не удалось инициализировать прокси - нет Session

Я хочу избежать загрузки EAGER.Как реализовать этот код, чтобы я мог случайным образом получить пользователя, который является частью UserGroup, которая является частью SubmissionUserGroups в объекте DocumentType.

1 Ответ

0 голосов
/ 15 февраля 2019

Вероятно, частью вашей проблемы является то, что вы использовали аннотацию @Transactional для метода private.В соответствии с документами это не работает:

При использовании прокси вы должны применять аннотацию @Transactional только к методам с общедоступной видимостью.Если вы аннотируете защищенные, частные или видимые пакетами методы с помощью аннотации @Transactional, ошибка не возникает, но аннотированный метод не отображает настроенные параметры транзакции.Подумайте об использовании AspectJ (см. Ниже), если вам нужно аннотировать закрытые методы.

Кроме того, я нахожу способ получить User из типа документа немного сложным для понимания,Отчасти проблема заключается в количестве времени, которое вы просматриваете в коллекциях, находите что-то, а затем просматриваете в другой коллекции.

Возможно, будет проще (и больше в соответствии с идиомами Spring) вставить UserRepositoryв этот класс и сделать отдельный запрос здесь.Если этот метод также общедоступен, я полагаю, что он будет включен в ту же транзакцию, поэтому вы не понесете лишних затрат при открытии другого сеанса.

Однако вам следует провести еще несколько исследований по этому вопросу.Вам может пригодиться этот пост: Как загружать ленивые извлеченные элементы из Hibernate / JPA в мой контроллер .

...