내가 예외가왜 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()
에서 제거하면 작동합니다.
누군가 내게 이유를 말해 줄 수 있습니까?
짧은 버전 : 이것은 클래스에 내부적 인 * 자체 호출이므로 스프링이 호출 할 때와 동일한 장식을 적용 할 수 없습니다. 콩 (주사하기 전에 감싸는). – chrylis