为了账号安全,请及时绑定邮箱和手机立即绑定

在 spring jpa 中执行 Hibernate.initialize() 时获取并发修改异常

在 spring jpa 中执行 Hibernate.initialize() 时获取并发修改异常

撒科打诨 2023-03-23 16:35:15
我正在使用带有 spring data jpa 的 spring boot 应用程序。当我遍历对象时出现并发修改异常。当我遍历 submission.getPages() 时,我得到了 concurrentModificationException。我厌倦了检查 null 和 empty 但没有运气@Override    public void processCopyAttachmentsToProcessAttachments(int processId) {        Optional<Process> processOpt = processRepository.findById(processId);        if (processOpt.isEmpty()) {            return;        }        Process process = processOpt.get();        Hibernate.initialize(process.getSubmissons());        List<Submission> submissions = process.getSubmissons();        if (submissions == null || submissions.isEmpty())            return;        for (Submission submission : submissions) {            Hibernate.initialize(submission.getPages());                    if (submission.getPages() == null || submission.getPages().isEmpty())                return;            for (SubmissionPage submissionPage : submission.getPages()) {                           Hibernate.initialize(submissionPage.getAttachments());                if (submissionPage.getAttachments() == null || submissionPage.getAttachments().isEmpty())                    return;                         for (SubmissionPageAttachment submissionPageAttachment : submissionPage.getAttachments()) {                    ProcessAttachment processAttachment = new ProcessAttachment();                    processAttachment.setDocumentId(submissionPageAttachment.getDocumentId());                    processAttachment.setDocumentType(submissionPageAttachment.getDocumentType());                    processAttachment.setProcess(process);                    processAttachmentRepository.save(processAttachment);                }            }        }    }如何解决这个问题?
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

再次检查您的问题,我认为罪魁祸首是Hibernate.initialize. 因为它修改了传递的对象。


这是该方法的源代码。正如我们清楚地看到的,它修改了它们的状态,并且因为我们知道ConcurrentModificationException在迭代时内容被更改时会发生这种情况,这显然是原因。


    public static void initialize(Object proxy) throws HibernateException {

        if ( proxy == null ) {

            return;

        }


        if ( proxy instanceof HibernateProxy ) {

            ( (HibernateProxy) proxy ).getHibernateLazyInitializer().initialize();

        }

        else if ( proxy instanceof PersistentCollection ) {

            ( (PersistentCollection) proxy ).forceInitialization();

        }

        else if ( proxy instanceof PersistentAttributeInterceptable ) {

            final PersistentAttributeInterceptable interceptable = (PersistentAttributeInterceptable) proxy;

            final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor();

            if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) {

                ( (EnhancementAsProxyLazinessInterceptor) interceptor ).forceInitialize( proxy, null );

            }

        }

    }

当使用常规的 for 循环时,它一次从集合中访问一个对象,因此它不会出现异常。


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信