软删除实现中代理未过滤已删除实体导致加载失败的问题排查
软删除实现中代理未过滤已删除实体导致加载失败的问题排查
我正在尝试给项目实现软删除功能,但遇到了一个棘手的问题:系统居然在尝试加载一个本该被过滤掉的已删除实体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
相关产品推荐
相关产品推荐

