2013-06-09 2 views
0

У меня есть код.@Transactional или нет

@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(); 
    } 


} 

И Controler

@Autowired 
ArticlesDao dao; 

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

Мой вопрос, является ли Handler getHome() должен быть аннотированный @Transactional?

ответ

3

Нет, вы не должны использовать @Transactional по методу контроллера/контроллера. @Transactional лучше/правильно использовать в сервисном слое или DAO.

2

Обычно я использую @Transactional на уровне сервиса, а не в DAO, так как я хочу, чтобы транзакция выполняла операцию бизнес-значения, а не элементарную операцию.

В контроллерах, как и в вашем примере, нет реального кода, а просто делегирование методу службы, где выполняется транзакция, поэтому вам не нужно запускать другую транзакцию в контроллере.

0

Это хороший момент, чтобы начать декларативные транзакции на вашем уровне обслуживания/бизнеса.

В любом случае, я думаю, что @Transactional следует использовать в сервисном слое и в то же время на уровне интеграции. Вы можете использовать

@Transactional(propagation=Propagation.REQUIRES_NEW) 

в вашем уровне услуг, и, в то же время,

@Transactional(propagation=Propagation.REQUIRED) 

в вашем DAO. Ваш уровень интеграции будет более независимым и более легко проверяемым в транзакционной среде.

0

Только уровень обслуживания, а не DAO, должен знать поведение транзакции, поскольку это часть бизнес-логики.

Далее в вашем случае вы сможете совершать транзакции только с @Transactional(readOnly = true).

Смежные вопросы