Очевидно, что по умолчанию, когда мы выполняем entityManager.find(Post.class, 1L);
, тогда экземпляр Post
для id=1
будет извлечен и помещен в кэш 1-го уровня, а затем, если мы снова выполним тот же entityManager.find(Post.class, 1L);
в том же транзакции, экземпляр post будет возвращен непосредственно из кэша 1-го уровня без запроса к базе данных.
У меня следующий вопрос:
Проверяется ли кэш 1-го уровня только тогда, когда мы пытаемся получить сущность по id
выполняет entityManager.find(...);
метод? Я имею в виду, что если мы получим один и тот же экземпляр Post
(имеющий id = 1
) другим свойством, отличным от идентификатора, например используя критерий запроса выборки поста по имени? Будет ли проверяться кэш 1-го уровня?
А как насчет запроса той же строки по native query
, jpql
или spring data query method
? JPA / Hibernate анализирует native query
и jpql
запросы, чтобы выяснить, есть ли соответствующая сущность в кеше 1-го уровня?