Задать вопрос
@p-oleg

Hibernate — почему не работает кэш первого уровня?

Из документации:
Кеш первого уровня всегда привязан к объекту сессии. Hibernate всегда по умолчанию использует этот кеш и его нельзя отключить.

Мой код.

@Entity
@Table(name = "okof")
public class Okof {
    @Id
    protected Integer id;

    @Column(name = "name")
    private String name;

    public Okof() {
    }
	...
}

@Repository
public class JpaOkofRepositoryImpl implements OkofRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Okof> getOkofList() {
        return em.createQuery("SELECT o FROM Okof o ORDER BY o.code").getResultList();
    }
	...
}


Тестируем:
public static void main(String[] args) {
	try (GenericXmlApplicationContext appCtx = new GenericXmlApplicationContext()) {
		appCtx.load("spring/spring-app.xml", "spring/spring-db.xml");
		appCtx.refresh();

		OkofRepository repository = appCtx.getBean(OkofRepository.class);
		repository.getOkofList();
		repository.getOkofList();
	}
}


В консоле видим:
Hibernate: 
    /* SELECT
        o 
    FROM
        Okof o 
    ORDER BY
        o.code */ select
            okof0_.code as code1_1_,
            okof0_.name as name2_1_ 
        from
            okof okof0_ 
        order by
            okof0_.code
Hibernate: 
    /* SELECT
        o 
    FROM
        Okof o 
    ORDER BY
        o.code */ select
            okof0_.code as code1_1_,
            okof0_.name as name2_1_
        from
            okof okof0_ 
        order by
            okof0_.code


Т.е. два раза вызвал метод с запросом - и два раза запрос ушел в базу, хотя должен был один.
Что я не догоняю?
Спасибо.
  • Вопрос задан
  • 235 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@sviato_slav
Из документации:
Кеш первого уровня всегда привязан к объекту сессии. Hibernate всегда по умолчанию использует этот кеш и его нельзя отключить.


Каждый вызов repository.getOkofList() в main() создает новый объект сессии. К моменту второго вызова repository.getOkofList() первая сессия и ее кэш уже уничтожены.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы