/ / Чи буде запит HQL використовувати кеш другого рівня Hibernate - java, hibernate, jpa, hql, кеш другого рівня

Чи буде запит HQL використовувати кеш другого рівня Hibernate - java, hibernate, jpa, hql, кеш другого рівня

Я хотів би прояснити деякі моменти щодо кешу другого рівня сплячого режиму. Справа уточнити, чи будуть запити HQL завжди потрапляти в базу даних (принаймні для отримання ідентифікаторів).

Розглянемо, що ми маємо об'єкти

class Customer {

long id;  // Primary key

String name;

set <Address> addressList;   // One to many relationship

}

class Address{

long id; // Primary key

String houseName;

}

Таблиця бази даних для адреси має посилання на зовнішню ключу для клієнта (id), щоб підтримувати один-багато відносин.

Як передумову, я включив кеш рівня 2 для сплячого режиму як EHcache. Тільки об'єкт і асоціації налаштовані на кешування. Кешування запиту не ввімкнено.

Я знаю, що, якщо я використовую session.get () або session.load () більше одного разу, лише перший виклик запускає запит до баз даних, а наступні - дані з кеша 2 рівня.

Мої питання

1) Чи зможе HQL скористатися кешем другого рівня? В одному сеансі я виконував один HQL, щоб отримати об'єкт, використовуючи первинний ключ (id), "від клієнта c, де c.id =?") .SetParameter (1, 1005).

Якщо я виконую один і той же HQL в іншому сеансі, чи буде об'єкт Клієнта взятий з кеш-пам'яті рівня 2 або він знову потрапить до бази даних.

2) Розглянемо інший HQL виконаний from Customer as c left join fetch c.addressList для вибору клієнта та пов'язаної адреси.

Якщо я виконую той же HQL в іншому сеансі, чи буде пов'язана адреса з кеша 2-го рівня, або вона знову потрапить до бази даних.

Відповіді:

4 для відповіді № 1

Оскільки ви не активували кеш запиту, жоден запит не потрапляє до кешу 2-го рівня. Таким чином, обидва запити виконуються проти БД.

Ви можете включити кеш запитів, якщо ви хочете замість цих запитів використовувати кеш 2-го рівня. Перевіряти Ця стаття докладніше про цю тему.