2015-11-11 3 views
0

У меня есть несколько классов, аннотированных в @TransactionalSpring + Hibernate несколько классов @Transactional находятся в одном сеансе?

К примеру у меня есть первый класс, который является весна Резольвер

<annotation-driven>    
     <mvc:argument-resolvers> 
      <beans:bean class="TestResolver" /> 
     </mvc:argument-resolvers> 
    </annotation-driven> 

класс

@Transactional 
public class TestResolver implements HandlerMethodArgumentResolver { 
      @SuppressWarnings("unchecked") 
      public Object resolveArgument(MethodParameter parameter, 
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest, 
        WebDataBinderFactory binderFactory) throws Exception { 

        return testDao.load(Test.class, 1L) 

      }  
     } 

И я класс контроллера также аннотированный @Transactional

@Controller 
@Transactional 
@RequestMapping(value = "go") 
public class TestController { 


    @RequestMapping... 
    public Test get() { 
     return testDao.load(Test.class, 1);   
    } 
} 

Проблема заключается в том, что каждый раз, когда я обращаюсь к testDao.load (Test.class, 1), hibernate выдает запрос в базу данных и не вытаскивает Test.class id = 1 из кеша в контроллере.

Почему он не использует кеш? эти два вызова происходят по одному запросу, но похоже на другой сеанс.

Если я в контроллере

testDao.load(Test.class, 1); 
testDao.load(Test.class, 1); 

второй раз он использует кэш, но не тогда, когда два разных componetns выполнения им код ..

+0

Я только поставил @Transactional аннотации в свои службы. –

+0

Hibernate не использует кеш (второго уровня), потому что вы его не настроили. – zeroflagL

ответ

0

Это @Transactional аннотацию на целые классы немного прискорбно здесь (это не значит, что это плохая идея, в общем, просто Мэ трудно понимаете проблему таким образом), ставя ее на методы, сделало бы более очевидным то, что здесь происходит - каждый из вызванных методов вызывается в отдельной транзакции (если только на самом деле не называет второе, но я понимаю, что они называются последовательно).

Hibernate, вероятно, определяет, что он не должен использовать кеш для двух транзакций.

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