Here is my simple method – just returns DTOs
public List<DishResponseDTO> getAll() { List<Dish> dishlsit = dishRepository.findAll(); return dishlsit.stream() .map(DishMapper::toDishResponseDTO) .collect(Collectors.toList()); }
I call it in @SpringBootTest with a @Transactional annotation.
@Test @Transactional public void get() { System.out.println(dishService.getAll()); System.out.println(dishService.getAll()); System.out.println(dishService.getAll()); }
Does it perform all calls in a single session? I though it does, because of the @Transactional, but the problem is that I have 3 calls to DB. I thought that Hibernate First level cache makes sure not to call the same objects with the same paremeters again in scope of a session.
Advertisement
Answer
Hibernate does indeed have the entity objects in the first level cache keyed by the primary key, but what you are doing with findAll
is executing a query, which usually always has to go to the database. Hibernate has a second level cache (for entities) and a query cache though, which will allow you to avoid executing the query on the database irrespective of the session.