当前位置: 首页 > 知识库问答 >
问题:

如何在Java jpa中从列表延迟加载对象?

孙成益
2023-03-14
@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;
    @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);
}

我想避免急切的抓取。如何实现这段代码,这样我就可以随机获取User,它是UserGroup的一部分,它是DocumentType对象中SubmissionUserGroups的一部分。

共有1个答案

康言
2023-03-14

部分问题可能是在private方法上使用了@transactional注释。根据文件,这不起作用:

当使用代理时,应该只对具有公共可见性的方法应用@Transactional注释。如果使用@transactional注释对受保护的、私有的或包可见的方法进行注释,则不会引发错误,但带注释的方法不会显示配置的事务性设置。如果需要注释非公共方法,请考虑使用AspectJ(见下文)。

此外,我发现从文档类型获取用户的方式有点难以理解。问题的一部分是您流经集合、查找某些内容,然后流经另一个集合的时间。

 类似资料:
  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 我想做一个reactjs页面懒惰加载图像。因此,我调用lazyLoadImages()内部的组件didMount()。我发现位于浏览器选项卡的浏览器加载指示器仍然一路旋转,直到加载所有图像。这让我认为我所做的并没有提供真正的懒惰加载图像体验。 有趣的是,如果我在setTimeout中用一个不太短的timeout参数包装lazyLoadImages(),例如100ms(不是0或甚至50ms),那么页

  • 问题内容: 我有一个像这样的领域类: 并且我想启用延迟加载到“内容”列的方法,因为应用程序无需访问此列即可执行某些操作。 但是lazy:true选项不起作用…任何想法或解决方法? 问题答案: 您所说的应用程序是什么意思?您想建立什么? 仅供参考。渴望和延迟加载通常与关系有关,默认情况下,grails启用了延迟加载。例如” 在您的代码中没有关系。content是Document的属性,因此延迟加载在

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 问题内容: 我想知道在node.js中使用是否等效于延迟加载? 例如,如果我有一个函数需要代码中其他任何地方都不需要的特定node.js包,那么我最好在该函数内部使用它,以便仅在调用该函数时才包含所需的包。 我还不确定是否会由于缺乏对node.js架构的了解而在性能方面有所改善?我想它每次与服务器的连接都会使用更少的内存。但是,当它必须读取程序包时,它会增加磁盘的I / O吗,还是将其添加到内存中

  • 这是从这里开始的后续行动。 我正在实现一个表,它将数据异步加载到表单元格中。问题是,表单元格有时无法正确更新。有时它会以某种方式“挂起”并永远显示“加载...”。实际值只有在我在表中滚动一点时才会更新。 要复制,请在表格中快速向下滚动应用程序。某些单元格不会显示“延迟加载”值,而是显示占位符字符串。 延迟加载属性如下所示: } 应用程序如下所示: 完整的可运行代码可以在这里找到。