Как найти группы данного пользователя в activiti? - PullRequest
0 голосов
/ 28 октября 2018

Я использую activiti enterprise и синхронизировал все группы и пользователей от Keycloak до activiti.

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

Iя пытаюсь получить группу данного пользователя программным путем.

public List<String> getGroups(String email){    

    List<String> myList = new ArrayList<>();

    User user = userService.findUserByEmail(email);

    myList = user.getGroups().stream().map(gr -> gr.getName()).collect(Collectors.toList());

    myList.stream().forEach(gr -> System.out.println("group name" + gr));

    return myList;

}

Я получаю следующее исключение:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.activiti.domain.idm.User.groups, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:569)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:188)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:548)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:126)
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
at java.util.Spliterators$IteratorSpliterator.estimateSize(Spliterators.java:1821)
at java.util.Spliterator.getExactSizeIfKnown(Spliterator.java:408)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:480)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.xyz.service.MyUserService.getGroups(MyUserService.java:120)

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

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Не всегда рекомендуется менять fetchType, если вы не уверены, что вам всегда нужно загружать эту связь.

Возможно, вам следует рассмотреть возможность использования графов сущностей , которые позволят вам извлекать ваш пользовательский объект и его группы при необходимости.

Например,

@NamedEntityGraphs({
@NamedEntityGraph(
    name = "User.groups",
    attributeNodes = {
            @NamedAttributeNode(value = "groups")
    })
})

Затем вы можете добавить граф сущностей в свой метод репозитория, как показано ниже, чтобы получить пользователя и его группы

@EntityGraph("User.groups")
List<User> findUserByEmail(String email);

РЕДАКТИРОВАТЬ:

В качестве альтернативы, если все, что вы хотите сделать в коде, это получитьгруппы пользователей, то вы можете создать запрос JPA, чтобы просто выбрать эти группы, а не большой граф сущностей, который является пользователем и его группами.

Например,

@Query("SELECT user.groups FROM User user WHERE user.email = :email")
List<Group> findGroupsUserEmail(@Param("email") String email);
0 голосов
/ 28 октября 2018

Когда ваши управляемые объекты были объединены с fetch=FetchType.LAZY или просто без явного определения типа выборки (если это без определения, то это зависит от типа отношения ), тогда выборка присоединенного объектадолжно быть сделано в рамках транзакции.Таким образом, вы должны аннотировать свой метод с помощью @Transactional

...