2011-10-28 60 views
3

如果我不把@Transactional注释上limsservice”审计梅托德,审计日志不持久。但坚持persistenceService梅托德有媒体链接这个annotation.Why我必须把这个注释。春@Transactional注解的使用

@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

Spring参考章节10.5.6. Using @Transactional

是对此非常清楚:

提示

春建议您只标注具体的类(和具体类的方法)与@事务性注释,而不是注释接口。您当然可以将@Transactional注释放在一个接口(或一个接口方法)上,但是这只在您使用基于接口的代理时才会如您所期望的那样工作。该Java注解不是从接口继承,这意味着如果你正在使用基于类的代理(代理目标类=“真”)或基于织造方面(方式“切面”),则该交易设置没有被代理和编织基础架构认可,并且该对象不会被封装在事务代理中,这肯定会很糟糕。

相关问题