您现在的位置是:首页 >其他 >记一处BUG网站首页其他

记一处BUG

vico.wang 2026-07-02 12:01:05
简介记一处BUG

在编辑信息时出现如下异常信息:

java.lang.UnsupportedOperationException: null
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142) ~[na:na]
	at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.clear(ImmutableCollections.java:149) ~[na:na]
	at org.hibernate.collection.spi.PersistentBag.clear(PersistentBag.java:471) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:496) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.type.CollectionType.replace(CollectionType.java:676) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.type.TypeHelper.replace(TypeHelper.java:117) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:581) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:280) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:216) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:148) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:132) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:850) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:836) ~[hibernate-core-6.5.3.Final.jar:6.5.3.Final]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:364) ~[spring-orm-6.1.16.jar:6.1.16]
	at jdk.proxy2/jdk.proxy2.$Proxy258.merge(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319) ~[spring-orm-6.1.16.jar:6.1.16]
	at jdk.proxy2/jdk.proxy2.$Proxy258.merge(Unknown Source) ~[na:na]
	at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:635) ~[spring-data-jpa-3.3.7.jar:3.3.7]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:173) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:148) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:70) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) ~[spring-tx-6.1.16.jar:6.1.16]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.16.jar:6.1.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138) ~[spring-tx-6.1.16.jar:6.1.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-3.3.7.jar:3.3.7]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165) ~[spring-data-jpa-3.3.7.jar:3.3.7]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.16.jar:6.1.16]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.1.16.jar:6.1.16]
	at jdk.proxy2/jdk.proxy2.$Proxy317.save(Unknown Source) ~[na:na]
	at com.ilogistics.maintenance.manager.transport.order.ShippingWorkOrderManager.doFlush(ShippingWorkOrderManager.java:254) ~[classes/:na]
	at com.ilogistics.maintenance.manager.transport.order.ShippingWorkOrderManager.doFlush(ShippingWorkOrderManager.java:34) ~[classes/:na]

出现异常信息时,乍一看有点摸不着头脑,但是仔细看堆栈信息不难发现java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)这个信息。

java.util.ImmutableCollections.uoe(ImmutableCollections.java:142),这表明你正在尝试对一个不可变的集合执行不支持的操作。

一看到这个其实我已经知道是哪里出问题了。

这是我的PO类:


    @ElementCollection
    @CollectionTable(name = LogisticsMaintenanceDefs.TABLE_PREFIX + "shipping_work_order_recipient_departs",
            joinColumns = @JoinColumn(name = "shipping_work_order_id", referencedColumnName = "id"))
    private List<RecipientDepart> recipientDeparts;

    @Getter
    @Setter
    @Embeddable
    @Comment("接收科室ids(当前科室以及子集)")
    public static class RecipientDepart implements Serializable {
        @Serial
        private static final long serialVersionUID = 4888206176466396699L;
        @Comment("部门id")
        @Column(name = "depart_id")
        private String departId;
    }

出问题的代码

        //区分一下是送到部门,还是送给人
        shippingWorkOrderPO.setRecipientDeparts(dto.getRecipientDeparts().stream().map(depart->{
            ShippingWorkOrderPO.RecipientDepart recipientDepart = new ShippingWorkOrderPO.RecipientDepart();
            recipientDepart.setDepartId(depart);
            return recipientDepart;
        }).toList());

stream().toList() 返回的是一个不可变的集合,需要修改为可变集合

改为:

      shippingWorkOrderPO.setRecipientDeparts(dto.getRecipientDeparts().stream().map(depart->{
            ShippingWorkOrderPO.RecipientDepart recipientDepart = new ShippingWorkOrderPO.RecipientDepart();
            recipientDepart.setDepartId(depart);
            return recipientDepart;
        }).collect(Collectors.toList()));

注:在使用@CollectionTable 一定要注意,传入的集合一定要是可变集合

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。