2011-10-28 5 views
3

Si je ne mets pas d'annotation @Transactional sur la méthode d'audit de limsservice, le journal d'audit n'est pas conservé. Mais persister metod dans persistenceService a déjà cette annotation.Pourquoi je dois mettre cette annotation.Utilisation de l'annotation printanière @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."); 
    } 

} 

Répondre

1

chapitre Référence printemps 10.5.6. Using @Transactional

est très clair sur ce point:

Conseil

Spring vous recommande d'annoter que des classes concrètes (et les méthodes de classes concrètes) avec le @ Annotation transactionnelle, par opposition aux interfaces d'annotation. Vous pouvez certainement placer l'annotation @Transactional sur une interface (ou une méthode d'interface), mais cela fonctionne uniquement comme vous le feriez si vous utilisez des proxies basés sur l'interface. Le fait que les annotations Java ne soient pas héritées des interfaces signifie que si vous utilisez des proxies basés sur des classes (proxy-target-class = "true") ou l'aspect "Weaving-based" (mode = "aspectj"), les paramètres de transaction sont non reconnu par l'infrastructure de proxy et de tissage, et l'objet ne sera pas enveloppé dans un proxy transactionnel, ce qui serait décidément mauvais.

Questions connexes