diff --git a/README.md b/README.md
index 7065c6c..3f06fec 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,8 @@
+ [Основы CSS](#Основы-css) ![icon][done]
+ [Основы Web](#Основы-web) ![icon][done]
+ [Дополнительные материалы](#Дополнительные-материалы) ![icon][done]
-
++ [Spring](#Spring) ![icon][done]
++ [Hibernate](#Hibernate) ![icon][done]
[done]:done.png
## ООП
@@ -754,6 +755,129 @@
+ [Top Spring Framework Interview Questions](https://www.baeldung.com/spring-interview-questions)
+ [Spring Interview Questions](https://www.interviewbit.com/spring-interview-questions/)
+## Spring
++ [Spring Framework](spring.md)
+1. Расскажите о Spring Framework.
+2. Какие некоторые из важных особенностей и преимуществ Spring Framework?
+3. Что вы понимаете под Dependency Injection (DI)?
+4. Как реализуется DI в Spring Framework?
+5. Какие преимущества использования Spring Tool Suite?
+6. Приведите названия некоторых важных Spring модулей.
+7. Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)?
+8. Что такое Aspect, Advice, Pointcut, JoinPoint и Advice Arguments в АОП?
+9. В чем разница между Spring AOP и AspectJ АОП?
+10. Что такое IoC контейнер Spring?
+11. Что такое Spring бин?
+12. Какое значение имеет конфигурационный файл Spring Bean?
+13. Какие различные способы настроить класс как Spring Bean?
+14. Какие вы знаете различные scope у Spring Bean?
+15. Что такое жизненный цикл Spring Bean?
+16. Как получить объекты ServletContext и ServletConfig внутри Spring Bean?
+17. Что такое связывание в Spring и расскажите об аннотации @Autowired?
+18. Какие различные типы автоматического связывания в Spring?
+19. Является ли Spring бин потокобезопасным?
+20. Что такое контроллер в Spring MVC?
+21. Какая разница между аннотациями @Component, @Repository и @Service в Spring?
+22. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.
+23. Что такое ViewResolver в Spring?
+24. Что такое MultipartResolver и когда его использовать?
+25. Как обрабатывать исключения в Spring MVC Framework?
+26. Как создать ApplicationContext в программе Java?
+27. Можем ли мы иметь несколько файлов конфигурации Spring?
+28. Какие минимальные настройки, чтобы создать приложение Spring MVC?
+29. Как бы вы связали Spring MVC Framework и архитектуру MVC?
+30. Как добиться локализации в приложениях Spring MVC?
+31. 31. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?
+32. Приведите пример часто используемых аннотаций Spring.
+33. Можем ли мы послать объект как ответ метода обработчика контроллера?
+34. Как загрузить файл в Spring MVC?
+35. Как проверить (валидировать) данные формы в Spring Web MVC Framework?
+36. Что вы знаете Spring MVC Interceptor и как он используется?
+37. Spring JdbcTemplate класс и его применение.
+38. Как использовать Tomcat JNDI DataSource в веб-приложении Spring?
+39. Каким образом можно управлять транзакциями в Spring?
+40. Расскажите о Spring DAO.
+41. Как интегрировать Spring и Hibernate?
+42. Расскажите о Spring Security.
+43. Как внедрить java.util.Properties в Spring Bean?
+44. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework?
+45. Best Practices в Spring Framework.
+46. Для чего нужен Component Scan?
+47. Как вы добавите Component Scan в Spring Boot? В чём отличие между @Component и @ComponentScan?
+48. Для чего используется аннотация @Bean?
+49. В чём разница между @Bean и @Component?
+50. В чём разница между @Component, @Service и @Repository аннотациями?
+51. Можем ли мы использовать @Component вместо @Service для бизнес логики?
+52. В чем различие между web.xml и the Spring Context - servlet.xml?
+53. Что предпочитаете использовать для конфигурации Spring - xml или аннотирование?
+54. Можем ли мы применить @Autowired с не сеттерами и не конструкторами методами?
+55. В чем разница между Сквозной Функциональностью (Cross Cutting Concerns) и АОП (аспектно оринтированное программирование)?
+56. В чем разница между IOC (Inversion of Control) и Application Context?
+57. В чем разница между classPathXmlApplicationContext и annotationConfigApplicationContext?
+58. Почему возвращаемое значение при применении аспекта @Around может потеряться? Назовите причины.
+59. Как вы решаете какой бин инжектить, если у вас несколько подходящих бинов. Расскажите о @Primary и @Qualifier?
+60. Что нового в Spring Framework 5.0?
+61. Сравните Application Context, IOC Container, vs Web Container и EJB Container. Нужен ли Web Container для запуска Spring Boot приложения?
+62. Как мы можем выбрать подходящий бин при помощи application.properties?
+63. Какая минимальная версия Java поддерживается в Spring Boot 2 и Spring 5?
+64. В чём разница между @Controller и @RestController?
+65. Почему иногда мы используем @ResponseBody, а иногда ResponseEntity?
+66. В чем разница между Filters, Listeners and Interceptors?
+67. В чем разница между ModelMap и ModelAndView?
+68. В чем разница между model.put() и model.addAttribute()?
+69. Что можете рассказать про Form Binding?
+70. Почему мы используем Hibernate Validator?
+71. Где должны располагаться статические (css, js, html) ресурсы в Spring MVC приложении?
+72. Почему для конфиденциальных данных рекомендуется использовать POST, а не GET запросы?
+73. Можно ли передать в запросе один и тот же параметр несколько раз?
+
+## Hibernate
++ [Что такое Hibernate Framework?](hibernate.md)
+1. Что такое Hibernate Framework?
+2. Какие важные преимущества дает использование Hibernate Framework?
+3. Какие преимущества Hibernate над JDBC?
+4. Назовите некоторые важные интерфейсы Hibernate.
+5. Что такое конфигурационный файл Hibernate?
+6. Что такое Hibernate mapping file?
+7. Назовите некоторые важные аннотации, используемые для отображения в Hibernate.
+8. Что вы знаете о Hibernate SessionFactory и как его сконфигурировать?
+9. Является ли Hibernate SessionFactory потокобезопасным?
+10. Как получить Hibernate Session и что это такое?
+11. Является ли Hibernate Session потокобезопасным?
+12. В чем разница между openSession и getCurrentSession?
+13. Какая разница между методами Hibernate Session get() и load()?
+14. Что вы знаете о кэшировании в Hibernate? Объясните понятие кэш первого уровня в Hibernate?
+15. Как настроить кэш второго уровня в Hibernate с помощью EHCache?
+16. Какие существуют различные состояния у entity bean?
+17. Как используется вызов метода Hibernate Session merge()?
+18. В чем разница между Hibernate save(), saveOrUpdate() и persist()?
+19. Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean?
+20. В чем разница между sorted collection и ordered collection? Какая из них лучше?
+21. Какие типы коллекций в Hibernate вы знаете?
+22. Как реализованы Join’ы Hibernate?
+23. Почему мы не должны делать Entity class как final?
+24. Что вы знаете о HQL и какие его преимущества?
+25. Что такое Query Cache в Hibernate?
+26. Можем ли мы выполнить нативный запрос SQL (sql native) в Hibernate?
+27. Назовите преимущества поддержки нативного sql в Hibernate.
+28. Что такое Named SQL Query?
+29. Какие преимущества Named SQL Query?
+30. Расскажите о преимуществах использования Hibernate Criteria API.
+31. 31. Как логировать созданные Hibernate SQL запросы в лог-файлы?
+32. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)?
+33. Как реализованы отношения в Hibernate?
+34. Как управлять транзакциями с помощью Hibernate?
+35. Что такое каскадные связи (обновления) и какие каскадные типы есть в Hibernate?
+36. Как добавить логирование log4j в Hibernate приложение?
+37. Как использовать JNDI DataSource сервера приложений с Hibernate Framework?
+38. Как интегрировать Hibernate и Spring?
+39. Что вы знаете о классе HibernateTemplate?
+40. Как интегрировать Hibernate с Servlet или Struts2 веб приложением?
+41. Какие паттерны применяются в Hibernate?
+42. Расскажите о Hibernate Validator Framework.
+43. Какие преимущества дает использование плагина Hibernate Tools Eclipse?
+44. Best Practices в Hibernate.
+
[к оглавлению](#Вопросы-для-собеседования-на-java-developer)
## Источники
diff --git a/hibernate.md b/hibernate.md
new file mode 100644
index 0000000..1f9d34d
--- /dev/null
+++ b/hibernate.md
@@ -0,0 +1,526 @@
+## Ответы
+### 1. Что такое Hibernate Framework?
+ Hibernate — библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping — ORM). Она представляет собой свободное программное обеспечение с открытым исходным кодом (open source), распространяемое на условиях GNU Lesser General Public License. Данная библиотека предоставляет легкий в использовании каркас (фреймворк) для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных. Hibernate совместима с JSR-220/317 и предоставляет стандартные средства JPA.
+
+### 2. Какие важные преимущества дает использование Hibernate Framework?
+Hibernate является одним из самых востребованных ORM фреймворков для Java. И вот почему:
+
++ Hibernate устраняет множество спагетти кода (повторяющегося), который постоянно преследует разработчика при работе с JDBC. Скрывает от разработчика множество кода, необходимого для управления ресурсами и позволяет сосредоточиться на бизнес логике.
++ Hibernate поддерживает XML так же как и JPA аннотации, что позволяет сделать реализацию кода независимой.
++ Hibernate предоставляет собственный мощный язык запросов (HQL), который похож на SQL. Стоит отметить, что HQL полностью объектно-ориентирован и понимает такие принципы, как наследование, полиморфизм и ассоциации (связи).
++ Hibernate – широко распространенный open source проект. Благодаря этому доступны тысячи открытых статей, примеров, а так же документации по использованию фреймворка.
++ Hibernate легко интегрируется с другими Java EE фреймворками, например, Spring Framework поддерживает встроенную интеграцию с Hibernate.
++ Hibernate поддерживает ленивую инициализацию используя proxy объекты и выполняет запросы к базе данных только по необходимости.
++ Hibernate поддерживает разные уровни cache, а следовательно может повысить производительность.
++ Важно, что Hibernate может использовать чистый SQL, а значит поддерживает возможность оптимизации запросов и работы с любым сторонним вендором БД и его фичами.
+### 3. Какие преимущества Hibernate над JDBC?
+ Hibernate имеет ряд преимуществ перед JDBC API:
+
+Hibernate удаляет множество повторяющегося кода из JDBC API, а следовательно его легче читать, писать и поддерживать.
+Hibernate поддерживает наследование, ассоциации и коллекции, что не доступно в JDBC API.
+Hibernate неявно использует управление транзакциями. Большинство запросов нельзя выполнить вне транзакции. При использовании JDBC API для управления транзакциями нужно явно использовать commit и rollback.
+JDBC API throws SQLException, которое относится к проверяемым исключениям, а значит необходимо постоянно писать множество блоков try-catch. В большинстве случаев это не нужно для каждого вызова JDBC и используется для управления транзакциями. Hibernate оборачивает исключения JDBC через непроверяемые JDBCException или HibernateException, а значит нет необходимости проверять их в коде каждый раз. Встроенная поддержка управления транзакциями в Hibernate убирает блоки try-catch.
+Hibernate Query Language (HQL) более объектно ориентированный и близкий к Java язык запросов, чем SQL в JDBC.
+Hibernate поддерживает кэширование, а запросы JDBC – нет, что может понизить производительность.
+Конфигурация Hibernate позволяет использовать JDBC вроде соединения по типу JNDI DataSource для пула соединений. Это важная фича для энтерпрайз приложений, которая полностью отсутствует в JDBC API.
+Hibernate поддерживает аннотации JPA, а значит код является переносимым на другие ORM фреймворки, реализующие стандарт, в то время как код JDBC сильно привязан к приложению.
+### 4. Назовите некоторые важные интерфейсы Hibernate.
+ SessionFactory (org.hibernate.SessionFactory) – неизменяемый потокобезопасный объект с компилированным маппингом для одной базы данных. Необходимо инициализировать SessionFactory всего один раз. Экземпляр SessionFactory используется для получения объектов Session, которые используются для операций с базами данных.
+ Session (org.hibernate.Session) – однопоточный короткоживущий объект, который предоставляет связь между объектами приложения и базой данных. Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction. Разработчик должен открывать сессию по необходимости и закрывать ее сразу после использования. Экземпляр Session является интерфейсом между кодом в java приложении и hibernate framework и предоставляет методы для операций CRUD.
+ Transaction (org.hibernate.Transaction) – однопоточный короткоживущий объект, используемый для атомарных операций. Это абстракция приложения от основных JDBC или JTA транзакций. org.hibernate.Session может занимать несколько org.hibernate.Transaction в определенных случаях.
+### 5. Что такое конфигурационный файл Hibernate?
+ Файл конфигурации Hibernate содержит в себе данные о базе данных и необходим для инициализации SessionFactory. В .xml файле необходимо указать вендора базы данных или JNDI ресурсы, а так же информацию об используемом диалекте, что поможет hibernate выбрать режим работы с конкретной базой данных.
+
+### 6. Что такое Hibernate mapping file?
+ Файл отображения (mapping file) используется для связи entity бинов и колонок в таблице базы данных. В случаях, когда не используются аннотации JPA, файл отображения .xml может быть полезен (например при использовании сторонних библиотек).
+
+### 7. Назовите некоторые важные аннотации, используемые для отображения в Hibernate.
+ Hibernate поддерживает как аннотации из JPA, так и свои собственные, которые находятся в пакете org.hibernate.annotations. Наиболее важные аннотации JPA и Hibernate:
+
+javax.persistence.Entity: используется для указания класса как entity bean.
+javax.persistence.Table: используется для определения имени таблицы из БД, которая будет отображаться на entity bean.
+javax.persistence.Access: определяет тип доступа, поле или свойство. Поле – является значением по умолчанию и если нужно, чтобы hibernate использовал методы getter/setter, то их необходимо задать для нужного свойства.
+javax.persistence.Id: определяет primary key в entity bean.
+javax.persistence.EmbeddedId: используется для определения составного ключа в бине.
+javax.persistence.Column: определяет имя колонки из таблицы в базе данных.
+javax.persistence.GeneratedValue: задает стратегию создания основных ключей. Используется в сочетании с javax.persistence.GenerationType enum.
+javax.persistence.OneToOne: задает связь один-к-одному между двумя сущностными бинами. Соответственно есть другие аннотации OneToMany, ManyToOne и ManyToMany.
+org.hibernate.annotations.Cascade: определяет каскадную связь между двумя entity бинами. Используется в связке с org.hibernate.annotations.CascadeType.
+javax.persistence.PrimaryKeyJoinColumn: определяет внешний ключ для свойства. Используется вместе с org.hibernate.annotations.GenericGenerator и org.hibernate.annotations.Parameter.
+### 8. Что вы знаете о Hibernate SessionFactory и как его сконфигурировать?
+ SessionFactory является фабрикой классов и используется для получения объектов session. SessionFactory отвечает за считывание параметров конфигурации Hibernate и подключение к базе данных. Обычно в приложении имеется только один экземпляр SessionFactory и потоки, обслуживающие клиентские запросы, получают экземпляры session с помощью объекта SessionFactory. Внутреннее состояние SessionFactory неизменно (immutable). Internal state (внутреннее состояние) включает в себя все метаданные об Object/ Relational Mapping и задается при создании SessionFactory.
+
+SessionFactory также предоставляет методы для получения метаданных класса и статистики, вроде данных о втором уровне кэша, выполняемых запросах и т.д.
+
+### 9. Является ли Hibernate SessionFactory потокобезопасным?
+ Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.
+
+### 10. Как получить Hibernate Session и что это такое?
+ Объект Hibernate Session является связью между кодом java приложения и hibernate. Это основной интерфейс для выполнения операций с базой данных. Жизненный цикл объекта session связан с началом и окончанием транзакции. Этот объект предоставляет методы для CRUD (create, read, update, delete) операций для объекта персистентности. С помощью этого экземпляра можно выполнять HQL, SQL запросы и задавать критерии выборки.
+
+### 11. Является ли Hibernate Session потокобезопасным?
+ Объект Hibernate Session не является потокобезопасным. Каждый поток должен иметь свой собственный объект Session и закрывать его по окончанию.
+
+### 12. В чем разница между openSession и getCurrentSession?
+ Hibernate SessionFactory getCurrentSession() возвращает сессию, связанную с контекстом. Но для того, чтобы это работало, нам нужно настроить его в конфигурационном файле hibernate. Так как этот объект session связан с контекстом hibernate, то отпадает необходимость к его закрытию. Объект session закрывается вместе с закрытием SessionFactory.
+
+thread
+1
+thread
+Метод Hibernate SessionFactory openSession() всегда создает новую сессию. Мы должны обязательно контролировать закрытие объекта сеанса по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект session для каждого запроса.
+
+Существует еще один метод openStatelessSession(), который возвращает session без поддержки состояния. Такой объект не реализует первый уровень кэширования и не взаимодействует с вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий. Такие объекты могут быть полезны при загрузке больших объемов данных без удержания большого кол-ва информации в кэше.
+
+### 13. Какая разница между методами Hibernate Session get() и load()?
+ Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого – get() и load().
+
+get() загружает данные сразу при вызове, в то время как load() использует прокси объект и загружает данные только тогда, когда это требуется на самом деле. В этом плане load() имеет преимущество в плане ленивой загрузки данных.
+load() бросает исключение, когда данные не найдены. Поэтому его нужно использовать только при уверенности в существовании данных.
+Нужно использовать метод get(), если необходимо удостовериться в наличии данных в БД.
+### 14. Что вы знаете о кэшировании в Hibernate? Объясните понятие кэш первого уровня в Hibernate?
+ Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных.
+
+Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш.
+Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны.
+
+### 15. Как настроить кэш второго уровня в Hibernate с помощью EHCache?
+ EHCache является лучшим выбором для организации кэширования второго уровня в хибернейт. Для настройки второго уровня кэширования в хибернейт требуется выполнить несколько шагов.
+
+Добавить зависимость hibernate-ehcache в проект.
+
+org.hibernate
+hibernate-ehcache
+4.3.5.Final
+
+
+org.hibernate
+hibernate-ehcache
+4.3.5.Final
+
+Добавить несколько записей в конфигурационный файл Hibernate.
+org.hibernate.cache.ehcache.EhCacheRegionFactory
+
+
+
+
+
+true
+true
+/myehcache.xml
+
+org.hibernate.cache.ehcache.EhCacheRegionFactory
+
+
+
+
+
+true
+true
+/myehcache.xml
+Создать файл конфигурации EHCache.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Использовать аннотацию @Cache и указание настройки стратегии кэширование над entity bean.
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+@Entity
+@Table(name = "ADDRESS")
+@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="employee")
+public class Address {
+}
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+@Entity
+@Table(name = "ADDRESS")
+@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="employee")
+public class Address {
+
+}
+
+### 16. Какие существуют различные состояния у entity bean?
+ Transient: состояние, при котором объект никогда не был связан с какой-либо сессией и не является персистентностью. Этот объект находится во временном состоянии. Объект в этом состоянии может стать персистентным при вызове метода save(), persist() или saveOrUpdate(). Объект персистентности может перейти в transient состоянии после вызова метода delete().
+ Persistent: когда объект связан с уникальной сессией он находится в состоянии persistent (персистентности). Любой экземпляр, возвращаемый методами get() или load() находится в состоянии persistent.
+ Detached: если объект был персистентным, но сейчас не связан с какой-либо сессией, то он находится в отвязанном (detached) состоянии. Такой объект можно сделать персистентным используя методы update(), saveOrUpdate(), lock() или replicate(). Состояния transient или detached так же могут перейти в состояние persistent как новый объект персистентности после вызова метода merge().
+### 17. Как используется вызов метода Hibernate Session merge()?
+ Hibernate merge() может быть использован для обновления существующих значений, однако этот метод создает копию из переданного объекта сущности и возвращает его. Возвращаемый объект является частью контекста персистентности и отслеживает любые изменения, а переданный объект не отслеживается.
+
+### 18. В чем разница между Hibernate save(), saveOrUpdate() и persist()?
+ Hibernate save() используется для сохранения сущности в базу данных. Проблема с использованием метода save() заключается в том, что он может быть вызван без транзакции. А следовательно если у нас имеется отображение нескольких объектов, то только первичный объект будет сохранен и мы получим несогласованные данные. Также save() немедленно возвращает сгенерированный идентификатор.
+
+Hibernate persist() аналогичен save() с транзакцией. persist() не возвращает сгенерированный идентификатор сразу.
+
+Hibernate saveOrUpdate() использует запрос для вставки или обновления, основываясь на предоставленных данных. Если данные уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate() можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save().
+
+### 19. Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean?
+ Hibernate использует рефлексию для создания экземпляров Entity бинов при вызове методов get() или load(). Для этого используется метод Class.newInstance(), который требует наличия конструктора без параметров. Поэтому, в случае его отсутствия, вы получите ошибку HibernateException.
+
+### 20. В чем разница между sorted collection и ordered collection? Какая из них лучше?
+ При использовании алгоритмов сортировки из Collection API для сортировки коллекции используется сортированный список (sorted list). Для маленьких коллекций это не приводит к излишнему расходу ресурсов, но на больших коллекциях это может привести к потере производительности и ошибкам OutOfMemory. Так же entity бины должны реализовывать интерфейс Comparable или Comparator для работы с сортированными коллекциями.
+
+При использовании фреймворка Hibernate для загрузки данных из базы данных мы можем применить Criteria API и команду order by для получения отсортированного списка (ordered list). Ordered list является лучшим выбором к sorted list, т.к. он использует сортировку на уровне базы данных. Она быстрее и не может привести к утечке памяти. Пример запроса к БД для получения ordered list:
+
+List empList = session.createCriteria(Employee.class)
+.addOrder(Order.desc("id")).list();
+1
+2
+List empList = session.createCriteria(Employee.class)
+.addOrder(Order.desc("id")).list();
+### 21. Какие типы коллекций в Hibernate вы знаете?
+ Bag
+ Set
+ List
+ Array
+ Map
+### 22. Как реализованы Join’ы Hibernate?
+ Существует несколько способов реализовать связи в Hibernate.
+
+Использовать ассоциации, такие как one-to-one, one-to-many, many-to-many.
+Использовать в HQL запросе команду JOIN. Существует другая форма “join fetch“, позволяющая загружать данные немедленно (не lazy).
+Использовать чистый SQL запрос с командой join.
+### 23. Почему мы не должны делать Entity class как final?
+ Хибернейт использует прокси классы для ленивой загрузки данных (т.е. по необходимости, а не сразу). Это достигается с помощью расширения entity bean и, следовательно, если бы он был final, то это было бы невозможно. Ленивая загрузка данных во многих случаях повышает производительность, а следовательно важна.
+
+### 24. Что вы знаете о HQL и какие его преимущества?
+ Hibernate Framework поставляется с мощным объектно-ориентированным языком запросов – Hibernate Query Language (HQL). Он очень похож на SQL, за исключением, что в нем используются объекты вместо имен таблиц, что делает язык ближе к объектно-ориентированному программированию.
+
+HQL является регистронезависимым, кроме использования в запросах имен java переменных и классов, где он подчиняется правилам Java. Например, SelECt то же самое, что и select, но ru.javastudy.MyClass отличен от ru.javastudy.MyCLASS. Запросы HQL кэшируются (это как плюс так и минус).
+
+Подробнее можете посмотреть в Hibernate — Hibernate Query (HQL) примеры: SELECT, INSERT, UPDATE, DELETE и в общем разделе Hibernate.
+
+### 25. Что такое Query Cache в Hibernate?
+ Hibernate реализует область кэша для запросов resultset, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции требуется несколько дополнительных шагов в коде. Query Cache полезны только для часто выполняющихся запросов с повторяющимися параметрами. Для начала необходимо добавить эту запись в файле конфигурации Hibernate:
+
+true
+1
+true
+Уже внутри кода приложения для запроса применяется метод setCacheable(true), как показано ниже:
+
+Query query = session.createQuery("from Employee");
+query.setCacheable(true);
+query.setCacheRegion("ALL_EMP");
+1
+2
+3
+Query query = session.createQuery("from Employee");
+query.setCacheable(true);
+query.setCacheRegion("ALL_EMP");
+### 26. Можем ли мы выполнить нативный запрос SQL (sql native) в Hibernate?
+ С помощью использования SQLQuery можно выполнять чистый запрос SQL. В общем случае это не рекомендуется, т.к. вы потеряете все преимущества HQL (ассоциации, кэширование). Выполнить можно примерно так:
+
+Transaction tx = session.beginTransaction();
+SQLQuery query = session.createSQLQuery("select emp_id, emp_name, emp_salary from Employee");
+List