2017-12-16 2 views
0

내가 예외가왜 TransactionRequired받을 예외도 방법 저장 엔티티는 @Transactional 주석을 붙일? 내가 사진을 업로드 할 때

방법

public ServiceResult uploadPortrait(MultipartFile file,int userId){ 
    if (file.getSize()>ConfigurationHolder.getPictureSize()) { 
     return ServiceResult.getErrorResult("exceed 2M!"); 
    }else{ 
     String filename=file.getOriginalFilename(); 
     String subfix=FileType.getSuffixByFilename(filename); 
     if(ConfigurationHolder.getPortraitFileType().contains(subfix)){ 
      String inLibPath=ConfigurationHolder.getUserPortraitInLibPath(userId, subfix); 
      try { 
       savePortraitToDataBase(inLibPath, userId); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return ServiceResult.getErrorResult("saveError!"); 
      } 
      ServiceResult result=ServiceResult.getSuccessResult("changeSuccess!"); 
      result.putProperty("portraitPath", inLibPath); 
      return result; 
     }else{ 
      return ServiceResult.getErrorResult("file type must be one of jpg,png,jpeg or gif!"); 
     } 
    } 
} 
@Transactional(value="account",rollbackFor=Exception.class) 
public void savePortraitToDataBase(String inLibPath, int userId){ 
    userOthersRepos.updatePortait(userId,inLibPath); 
    userOthersdao.savePortraitToRedis(inLibPath, userId); 
} 

예외

Caused by:exception'stacktrace:Caused by:javax.persistence.TransactionRequiredException: Executing an update/delete query 
     at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:372) 
     at $Proxy118.executeUpdate(Unknown Source) 
     at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:174) 
     at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:61) 
     at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:95) 
     at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:85) 
     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:323) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
     ... 79 more 

@Transactional 특수 효과를 추가하면 10을 savePortraitToDataBase()에서 제거하면 작동합니다.

누군가 내게 이유를 말해 줄 수 있습니까?

+1

짧은 버전 : 이것은 클래스에 내부적 인 * 자체 호출이므로 스프링이 호출 할 때와 동일한 장식을 적용 할 수 없습니다. 콩 (주사하기 전에 감싸는). – chrylis

답변

0

위의 코드에서 "uploadPortrait"에서 "savePortraitToDataBase"메서드를 호출하고이 호출 전에 "userOthersdao.savePortrait"를 호출합니다. 그것은 나에게 당신이 얻는 예외는 userOthersdao.savePortrait의 호출 때문이라고 보입니다. (삽입/업데이트 작업을 수행 할 수도 있고 @Transactional이 savePortraitToDataBase의이 메소드 위에있을 경우 트랜잭션이 누락 될 수 있습니다.)

그러나 다른 방법으로 @Transactional을 "uploadPortrait"함수 위에두면 트랜잭션은 두 가지 방법 모두에서 사용할 수 있습니다.

0

"Transactional"주석은 Spring 데코레이터입니다. 이것은 클래스 외부에서 호출 된 (또는 "autowired", 스프링 용어로) bean을 호출 할 때만 적용됩니다. 같은 클래스 내부에서 호출해도 같은 효과가 없습니다.

+0

및 @ chrylis 대단히 감사합니다! 새로운'@ service' 클래스를 추가하려고합니다. – jvk

관련 문제