如何在活动中找到给定用户的组?

时间:2018-10-28 15:36:54

标签: java alfresco activiti bpm

我使用activiti enterprise,并且已将Keycloak的所有组和用户同步到activiti。

在活动菜单中单击“组织”选项卡时,我可以看到所有组和用户。

我正在尝试以编程方式获取给定用户的组。

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 :(得分:0)

如果您的受管理实体是通过fetch=FetchType.LAZY进行联接的,或者只是没有对获取类型的显式定义(如果没有定义,则为it depends on a type of relationship),则必须在事务内完成对联接实体的获取。因此,您必须使用@Transactional

注释您的方法

答案 1 :(得分:0)

除非总是确定需要始终加载此关联,否则不建议您更改fetchType

也许您应该考虑使用entity graphs,这将允许您在需要时获取用户对象及其组。

例如

@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);