You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

软删除实现中代理未过滤已删除实体导致加载失败的问题排查

软删除实现中代理未过滤已删除实体导致加载失败的问题排查

我正在尝试给项目实现软删除功能,但遇到了一个棘手的问题:系统居然在尝试加载一个本该被过滤掉的已删除实体ID,结果抛出了找不到该实体的错误——但按道理它根本不应该去加载这个ID才对。

我用EntityManager查询数据,在把实体映射为Model的过程中,触发了懒加载代理的执行,直接抛出了找不到已删除文件的异常。

实体类代码

@Entity
@Table(name = "person", schema = "lap", catalog = "lapdb")
@Audited(withModifiedFlag = true)
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Parent implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Getter
    private Integer id;

    @NotAudited
    @OneToMany(mappedBy = "uploadedForPerson", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<Child> uploadedForDokuments = new LinkedHashSet<>();

    @NotAudited
    @OneToMany(mappedBy = "uploadedByPerson", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<Child> uploadedByDokuments = new LinkedHashSet<>();
}

@Entity
@Table(name = "dokument")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@SQLRestriction("status != 'deleted'")
public class Child implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Getter
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
    @JoinColumn(name = "uploaded_for_person_id")
    private Parent uploadedForPerson;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
    @JoinColumn(name = "uploaded_by_person_id")
    private Parent uploadedByPerson;

}

出错的映射代码

public ParentModel mapPersonFromEntity(Parent entity) {
        ParentModelBuilder parentBuilder = Parent.builder()
                .id(entity.getId())
                .uploadedByDocuments(entity.getUploadedByDocuments().stream()
                        .map(child -> childMapper.mapChildFromEntity(child))
                        .collect(Collectors.toSet()))
                .uploadedForDocuments(entity.getUploadedForDocuments()
                        .stream().map(child -> childMapper.mapChildFromEntity(child))
                        .collect(Collectors.toSet()));
        
        ParentModel parent = parentBuilder.build();
        return parent;
    }

错误堆栈跟踪

12:44:16,169 ERROR [org.jboss.as.ejb3.invocation] (default task-5) WFLYEJB0034: Jakarta Enterprise Beans Invocation failed on component DokumentMapper for method public ibbw.lap.intern.web.model.dokumente.Dokument ibbw.lap.intern.web.mapper.DokumentMapper.mapDokumentFromEntity(ibbw.lap.uebergreifende.jpa.entity.dokumente.DokumentEntity): jakarta.ejb.EJBTransactionRolledbackException: Unable to find ibbw.lap.uebergreifende.jpa.entity.dokumente.DokumentEntity with id 91
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:202)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:375)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:143)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:78)
    at org.jboss.as.weld.common@31.0.0.Final//org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:72)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:24)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:30)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.security.IdentityOutflowInterceptor.processInvocation(IdentityOutflowInterceptor.java:56)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.security.SecurityDomainInterceptor.processInvocation(SecurityDomainInterceptor.java:27)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.deployment.processors.StartupAwaitInterceptor.processInvocation(StartupAwaitInterceptor.java:27)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:47)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:50)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ee@31.0.0.Final//org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:33)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:438)
    at org.wildfly.security.elytron-base@2.2.3.Final//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:633)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:57)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at org.jboss.as.ee@31.0.0.Final//org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:181)
    at org.jboss.as.ee@31.0.0.Final//org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:174)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.security.IdentityInterceptor.lambda$processInvocation$0(IdentityInterceptor.java:30)
    at org.wildfly.security.elytron-base@2.2.3.Final//org.wildfly.security.auth.server.SecurityIdentity.runAsFunctionEx(SecurityIdentity.java:421)
    at org.wildfly.security.elytron-base@2.2.3.Final//org.wildfly.security.auth.server.Scoped.runAsFunctionEx(Scoped.java:161)
    at org.wildfly.security.elytron-base@2.2.3.Final//org.wildfly.security.auth.server.Scoped.runAsSupplierEx(Scoped.java:229)
    at org.jboss.as.ejb3@31.0.0.Final//org.jboss.as.ejb3.security.IdentityInterceptor.processInvocation(IdentityInterceptor.java:30)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation@2.0.0.Final//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at org.jboss.as.ee@31.0.0.Final//org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:64)
    at deployment.lap-internal-ear-1.2.2.ear.web.war//ibbw.lap.intern.web.mapper.DokumentMapper$$$view20.mapDokumentFromEntity(Unknown Source)
    at jdk.internal.reflect.GeneratedMethodAccessor74.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:412)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.module.ejb.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:133)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:54)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.module.ejb.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:69)
    at org.jboss.weld.core@5.1.2.Final//org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:109)
    at deployment.lap-internal-ear-1.2.2.ear.web.war//ibbw.lap.intern.web.mapper.DokumentMapper$Proxy$_$$_

备注:内容来源于stack exchange,提问作者Kajstrl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:39:34