2013-06-09 2 views
0

J'ai le code.@Transactional ou Non

@Repository 
public class ArticlesDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    /** 
    * @param count Specifited how many article get from DB 
    * @param start Start offset. Default 0 
    * @return all get article 
    */ 

    @Transactional 
    public List<Article> getLastArticles(Integer count, Integer start) { 

     if (start == null) { 
      start = 0; 
     } 

     final Session currentSession = sessionFactory.getCurrentSession(); 
     final Criteria criteria = currentSession.createCriteria(Article.class); 

     criteria.addOrder(Order.desc("publishedDate")); 

     criteria.setFirstResult(count + start); 
     criteria.setMaxResults(count); 

     return criteria.list(); 
    } 


} 

Et Controler

@Autowired 
ArticlesDao dao; 

@RequestMapping(value = "/") 
     public ModelAndView getHome(@RequestParam("page") int page) { 
     dao.getLastArticles("STH args"); 
} 

Ma question est de savoir si Handler getHome() devrait être annoté @Transactional?

Répondre

3

Non, vous ne devez pas utiliser @Transactional par rapport à la méthode du contrôleur/contrôleur. @Transactional est meilleur/correct à utiliser dans la couche de service ou DAO.

2

Normalement j'utilise @Transactional dans la couche de service et non dans le DAO, puisque je veux que la transaction détienne une opération de valeur commerciale et non une opération élémentaire. Dans les contrôleurs, comme dans votre exemple, il n'y a pas de vrai code, mais juste une délégation à une méthode de service, où la transaction est démarrée, donc vous n'avez pas besoin de démarrer une autre transaction dans le contrôleur.

0

C'est un bon point de commencer vos transactions déclaratives sur votre couche service/bussiness.

De toute façon je pense que @Transactional devrait être utilisé dans la couche de service, et, en même temps, dans la couche d'intégration. Vous pouvez utiliser

@Transactional(propagation=Propagation.REQUIRES_NEW) 

dans votre couche de service, et, en même temps,

@Transactional(propagation=Propagation.REQUIRED) 

dans votre DAO. Votre couche d'intégration sera plus indépendante et plus facilement testable dans un environnement transactionnel.

0

Seule la couche de service et non le DAO doit connaître le comportement de la transaction car cela fait partie de la logique métier.

En outre dans votre cas, vous pouvez faire votre transaction en lecture seule avec @Transactional(readOnly = true).

Questions connexes