首页 > 解决方案 > 实体中 @PreUpdate 上的 Stackoverflow

问题描述

当我尝试在实体上使用@PreUpdate 注释时,我得到一个stackoverflow 异常,该注释使用嵌入式可审计实体和@EntityListeners。

在我的代码中,我试图使用静态方法获取用户详细信息,以更新相关字段,

下面提到了我的代码

实体类- 可审计

 /*specify the date which modified*/
@Column(name = "is_belongs")
private boolean isBelongs=false;

@PrePersist
protected final void  belongTo(){
    this.isBelongs= TaxAdminSessionServiceHelper.checkAdminSesstion();
}


@PreUpdate
protected final void  belongToUpdated(){
    this.isBelongs=TaxAdminSessionServiceHelper.checkAdminSesstion();
}

静态方法

 public static boolean checkAdminSesstion(){

        HttpServletRequest curRequest =
                ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                        .getRequest();
        Optional<TokenRegistryEntity> tokenRegistryEntity = tokenRegistryService.getTokenByStatusAndUserId(Status.ACTIVE, UserPrincipal.getLoggedInUserId());

        if (tokenRegistryEntity.isPresent() && curRequest.getAttribute("adminId") != null) {
            Long adminId= Long.valueOf(request.getParameter("adminId"));
            Optional<TaxAdminSessionEntity> taxAdminSessionEntity = taxAdminSessionRepository
                    .findByTokenAndUserIdAndAdminIdAndStatus(tokenRegistryEntity.get().getToken(),
                            UserPrincipal.getLoggedInUserId(),
                            adminId  , SessionStatus.ACTIVE);
            return taxAdminSessionEntity.isPresent();
        }

    return false;
}

TokenRegistryServiceImpl

   @Override
    public Optional<TokenRegistryEntity> getTokenByStatusAndUserId(Status status, Long userId) {
        Optional<TokenRegistryEntity> tokenRegistryEntity=tokenRegistryRepository.findByUserIdAndStatus(userId,status);
        if (tokenRegistryEntity.isPresent()) {
            return tokenRegistryEntity;
        }
        return Optional.empty();
    }

令牌注册实体

@Entity(name = "um_token_registry")
@Data
public class TokenRegistryEntity extends UserBaseEntity {

    /*specify the serial version uid*/
  private static final long serialVersionUID = -5035686189848426777L;

    /*specify the unique id*/
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    /*specify the user token*/
    @Column(name = "token")
    private String token;

    /*specify the username*/
    @Column(name = "user_id")
    private long userId;

    /*specify the token status*/
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    private Status status;
}

有任何想法吗?

这是堆栈跟踪:

java.lang.StackOverflowError: null
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:195)
    at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.getService(SessionFactoryServiceRegistryImpl.java:98)
    at org.hibernate.query.criteria.internal.compile.CriteriaCompiler.compile(CriteriaCompiler.java:63)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:735)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:109)
    at jdk.internal.reflect.GeneratedMethodAccessor167.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:368)
    at com.sun.proxy.$Proxy170.createQuery(Unknown Source)
    at jdk.internal.reflect.GeneratedMethodAccessor167.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
    at com.sun.proxy.$Proxy170.createQuery(Unknown Source)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.createQuery(PartTreeJpaQuery.java:288)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.createQuery(PartTreeJpaQuery.java:241)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.doCreateQuery(PartTreeJpaQuery.java:106)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:226)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:196)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy195.findByUserIdAndStatus(Unknown Source)
    at com.kts.user.management.service.impl.TokenRegistryServiceImpl.getTokenByStatusAndUserId(TokenRegistryServiceImpl.java:120)
    at com.kts.user.management.service.helper.TaxAdminSessionServiceHelper.checkAdminSesstion(TaxAdminSessionServiceHelper.java:40)
    at com.kts.tax.service.common.entity.EmployerEntity.belongToUpdated(EmployerEntity.java:95)

目的 :

我需要更新该字段以得到另一个表的结果,如果它有一条记录我需要传递真(布尔值),如果不是那么假,

我正在寻找这件事的答案

标签: javaspringdatabasespring-boot

解决方案


推荐阅读