2011-10-28 2 views
3

@transactional 주석을 limsservice 'audit metod에 두지 않으면 감사 로그가 유지되지 않습니다. 그러나 persistenceService의 persist met는 allready이 주석을 가지고 있습니다. 왜이 주석을 넣어야합니까?Spring @ 트랜잭션 주석 사용법

@RequestMapping(value = "/lemf", method = RequestMethod.POST, headers = "Accept=application/json") 
    public 
    @ResponseBody 
    Lemf create(HttpServletResponse response, @RequestBody Lemf lemf) { 
     try { 
      Lemf l = limsService.findLemfByName(lemf.getName()); 
      if (l == null) { 
        lemf= limsService.addLemf(lemf); 
        limsService.audit("User action",getRequestInfo(),"New lemf created."); 
        return lemf; 
      } 
      sendError(response, "Lemf Allready exist."); 


     } catch (ProviderException e) { 
      sendError(response, e); 
     } 
     return null; 
    } 


public class PersistenceServiceImpl implements PersistenceService { 

    @Transactional(readOnly = false) 
    public <T extends Persistable> T persist(T obj) { 
     if (obj.getSystemId() != AbstractPersistable.UNSAVED_ID_VALUE) { 
      log.info("Updating... :" + obj); 
      T merged = em.merge(obj); 
      return merged; 
     } else { 
      em.persist(obj); 
      return obj; 
     } 
    } 

} 


public class LimsServiceImpl implements LimsService { 
    @Override 
    public Lemf addLemf(Lemf lemf) throws ProviderException { 
     return persistenceService.persist(lemf); 
    } 

    @Transactional 
    public void audit(String type,Pair<String,String > pair,String log) { 
     auditService. audit("User action", pair, "New lemf created."); 
    } 

} 

답변

1

봄 참조 장 10.5.6. Using @Transactional

이것에 대해 매우 분명하다 :

봄 경우에만 콘크리트 클래스 (및 구체적인 클래스의 메소드) 주석 것이 좋습니다

팁 @ 인터페이스에 주석을 달지 않고 트랜잭션 주석. @Transactional 어노테이션을 인터페이스 (또는 인터페이스 메소드)에 배치 할 수는 있지만, 인터페이스 기반 프록시를 사용하는 경우에만 기대할 수 있습니다. Java 주석이 인터페이스에서 상속되지 않는다는 사실은 클래스 기반 프록시 (proxy-target-class = "true") 또는 위빙 기반 aspect (mode = "aspectj")를 사용하는 경우 트랜잭션 설정이 다음과 같은 것을 의미합니다. 프록시 및 위빙 인프라에서 인식하지 못하고 개체가 트랜잭션 프록시로 래핑되지 않으며 이는 분명히 좋지 않습니다.

관련 문제