- Hibernate в вопросах и ответах
- 1. Что такое Hibernate Framework?
- 2. Преимущества использования Hibernate Framework?
- 3. Объекты Hibernate SessionFactory, Session и Transaction
- 4. Конфигурационный файл Hibernate
- 5. Файл mapping
- 6. Важные аннотации для отображения в Hibernate
- 7. Отличие методов openSession и getCurrentSession
- 8. Отличие методов get и load объекта Session
- 9. Различные состояния Entity Bean
- 10. Отличия методов save, saveOrUpdate и persist
- 11. Использование метода сессии merge
- 12. Отсутствие в Entity Bean конструктора без параметров
- 13. Entity Bean не должна быть final
- 14. Сортировка данных в Hibernate
- 15. Использование Query Cache в Hibernate
- 16. Язык запросов HQL
- 17. Нативный SQL-запрос в Hibernate
- 18. Преимущества поддержки нативного SQL-запроса
- 19. Именованный запрос, Named SQL Query
- 20. Преимущества именованных запросов Named SQL Query
- 21. Использование org.hibernate.Criteria
- 22. Hibernate proxy и ленивая загрузка (lazy load)
- 23. Каскадные связи
- 24. Управление транзакциями
- SessionFactory в Hibernate 4 для чайников
- 1 ответ 1
- Объект какого класса необходим для создания sessionfactory в hibernate
Hibernate в вопросах и ответах
1. Что такое Hibernate Framework?
Hibernate — это библиотека с открытым исходным кодом (open source) для Java, предназначенная для решения задач ORM (object-relational mapping, объектно-реляционного отображения). Она представляет собой свободное программное обеспечение, распространяемое на условиях GNU Lesser General Public License. Hibernate Framework имеет легкий в использовании каркас для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных и предоставляет стандартные средства JPA.
2. Преимущества использования Hibernate Framework?
Библиотека Hibernate является одним из самых востребованных ORM фреймворков для Java, поскольку :
3. Объекты Hibernate SessionFactory, Session и Transaction
SessionFactory | Экземпляр SessionFactory создается методом buildSessionFactory (ServiceRegistry) объекта org.hibernate.Configuration и предназначен для получения объекта Session. Инициализируется SessionFactory один раз. Внутреннее состояние SessionFactory неизменно (immutable), т.е. он является потокобезопасным. Internal state (внутреннее состояние) включает в себя все метаданные об Object Relational Mapping, определяемые при создании SessionFactory. SessionFactory также предоставляет методы для получения метаданных класса и статистики, типа данных о втором уровне кэша, выполняемых запросах и т.д. |
Session | Однопоточный объект, устанавливающий связь между объектами/сущностями приложения и базой данных. Сессия создается при необходимости работы с БД и ее необходимо закрыть сразу же после использования. Экземпляр Session является интерфейсом между кодом в java приложении и hibernate framework, предоставляя методы для операций CRUD. |
Transaction | Однопоточный объект, используемый для атомарных операций. Это абстракция приложения от основных JDBC или JTA транзакций. org.hibernate.Session может занимать несколько org.hibernate.Transaction в определенных случаях. |
Пример использования объектов SessionFactory, Session, Transaction.
4. Конфигурационный файл Hibernate
Файл конфигурации hibernate.cfg.xml содержит информацию о базе данных (драйвер, пул подключений, диалект) и параметрах подключения к серверу БД (url, login, password). В качестве параметров подключения можно использовать как JDBC, так и JNDI. В файле конфигурации также определяются дополнительные параметры, которые будут использованы при работе с сервером БД, Так, здесь необходимо определить маппинги сущностей/классов.
Чтобы отобразить в консоли SQL-скрипты, генерируемые Hibernate, необходимо в hibernate.cfg.xml определить истиное значение свойства «show_sql». Помните, что это необходимо использовать только на уровне разработки и тестирования. В финальной версии свойство «show_sql» должно быть отключено.
Пример файла конфигурации связанных сущностей.
5. Файл mapping
6. Важные аннотации для отображения в Hibernate
Наиболее употребительные аннотации Hibernate из пакета javax.persistence представлены в следующей таблице :
@Entity | Определение класса как сущность entity bean |
@Table, @Column | Определение таблицы в БД и наименования колонки в таблице |
@Id | Поле Primary Key в сущности entity bean |
@GeneratedValue | Определение стратегии создания основных ключей |
@SequenceGenerator | Определение генератора последовательности |
@OneToMany, @ManyToOne, @ManyToMany | Определение связи между сущностными бинами |
Подробнее об аннотациях в сущностных бинах.
7. Отличие методов openSession и getCurrentSession
Методы openSession и getCurrentSession объекта SessionFactory возвращают сессию Session.
Метод getCurrentSession объекта SessionFactory возвращает сессию, связанную с контекстом. Но для того, чтобы метод вернул не NULL, необходимо настроить параметр current_session_context_class в конфигурационном файле hibernate. Поскольку полученный объект Session связан с контекстом hibernate, то отпадает необходимость в его закрытии; он закрывается вместе с закрытием SessionFactory.
Метод openSession объекта SessionFactory всегда создает новую сессию. В этом случае необходимо обязательно контролировать закрытие объекта сессии по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект Session для каждого запроса.
При загрузке больших объемов данных без удержания большого количества информации в кэше можно использовать метод openStatelessSession(), который возвращает Session без поддержки состояния. Полученный объект не реализует первый уровень кэширования и не взаимодействует со вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий.
8. Отличие методов get и load объекта Session
Для загрузки информации из базы данных в виде набора/коллекции сущностей объект Session имеет несколько методов. Наиболее часто используемые методы get и load. Метод get загружает данные сразу же при вызове, в то время как load использует прокси объект и загружает данные только тогда, когда это требуется на самом деле (при обращении к данным). В этом плане load имеет преимущество в плане ленивой загрузки данных.
Метод load вызывает исключение, если данные не найдены. Поэтому load нужно использовать только при уверенности в существовании данных. Если необходимо удостовериться в наличии данных в БД, то нужно использовать метод get.
9. Различные состояния Entity Bean
Сущность Entity Bean может находиться в одном из трех состояний :
transient | Состояние сущности, при котором она не была связана с какой-либо сессией и не является persistent. Сущность может перейти в состояние persistent при вызове метода save(), persist() или saveOrUpdate() объекта сессии. |
persistent | Экземпляр сущности, полученный методами get() или load() объекта сессии, находится в состоянии persistent, т.е. связан с сессией. Из состояния persistent сущность можно перевести в transient после вызова метода delete() сессии. |
detached | Если объект находился в сотоянии persistent, но перестал быть связанным с какой-либо сессией, то он переходит в состояние detached. Такой объект можно сделать персистентным, используя методы update(), saveOrUpdate(), lock() или replicate(). |
Из состояний transient и detached объект можно перевести в состояние persistent в виде нового объекта после вызова метода merge().
10. Отличия методов save, saveOrUpdate и persist
Метод save используется для сохранения сущности в базе данных. Этот метод возвращает сгенерированный идентификатор. Возникаемые проблемы с использованием save связаны с тем, что метод может быть вызван без транзакции. А следовательно если имеется отображение нескольких связанных объектов, то только первичный объект будет сохранен, т.е. можно получить несогласованные данные.
Метод hibernate persist аналогичен save, но выполняется с транзакцией. Метод persist не возвращает сгенерированный идентификатор сразу.
Метод saveOrUpdate используется для вставки или обновления сущности. Если объект уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save.
11. Использование метода сессии merge
Метод Hibernate merge объекта сессии может быть использован для обновления существующих значений. Необходимо помнить, что данный метод создает и возвращает копию из переданного объекта сущности. Возвращаемый объект является частью контекста персистентности с отслеживанием любых изменений, а переданный объект не отслеживается.
12. Отсутствие в Entity Bean конструктора без параметров
Hibernate использует рефлексию для создания экземпляров Entity бинов при вызове методов get или load. Для этого используется метод Class.newInstance, который требует наличия конструктора без параметров. Поэтому, в случае его отсутствия, будет вызвано исключение HibernateException.
13. Entity Bean не должна быть final
Hibernate использует прокси классы для ленивой (lazy) загрузки данных (т.е. не сразу, а по необходимости). Это достигается с помощью расширения Entity Bean. Отсюда следует, что если бы он был final, то это было бы невозможно.
Ленивая загрузка данных во многих случаях повышает производительность, а следовательно важна и от нее не следует отказываться.
14. Сортировка данных в Hibernate
При использовании алгоритмов сортировки из Collection API используется сортированный список (sorted list). Для маленьких коллекций это не приводит к излишнему расходу ресурсов. Однако на больших коллекциях это может привести к потере производительности и ошибкам OutOfMemory.
Entity Bean’ы для работы с сортированными коллекциями должны реализовывать интерфейс Comparable/Comparator. При использовании фреймворка Hibernate для загрузки данных можно применить Collection API и команду order by для получения сортированного списка (ordered list). Ordered list является лучшим способом получения sorted list, т.к. используется сортировка на уровне базы данных, работающая быстрее и не приводящая к утечке памяти. Пример запроса к БД для получения ordered list :
Hibernate использует следующие типы коллекций : Bag, Set, List, Array, Map.
15. Использование Query Cache в Hibernate
Hibernate реализует область кэша для запросов ResultSet, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции необходимо определить истинное значение свойства hibernate.cache.use_query_cache в файле конфигурации hibernate.cfg.xml и в коде при обращении к БД использовать метод setCacheable(true). Кэшированные запросы полезны только при их частом исполнении с повторяющимися параметрами.
Определение свойства в файле конфигурации Hibernate :
Формирование запроса с использованием метода setCacheable (true) :
16. Язык запросов HQL
Hibernate включает мощный язык запросов HQL (Hibernate Query Language), который очень похож на родной SQL. В сравнении с SQL, HQL полностью объектно-ориентирован и использует понятия наследования, полиформизма и связывания.
HQL использует имя класса взамен имени таблицы, а также имя свойства вместо имени колонки. Пример HQL :
17. Нативный SQL-запрос в Hibernate
Для выполнения нативного запроса необходимо использовать SQLQuery, который может выполнять чистый SQL-запрос. Но необходимо учитывать, что в этом случае можно потерять все преимущества HQL (ассоциации, кэширование). Пример нативного SQL-запроса :
18. Преимущества поддержки нативного SQL-запроса
Использование нативного SQL может быть необходимо при выполнении некоторых запросов к базам данных, которые могут не поддерживаться в Hibernate. Т.е. включение в запросы специфичных для БД «фишек».
19. Именованный запрос, Named SQL Query
Hibernate поддерживает использование именованных запросов, которые можно определить в одном месте и использовать в любом месте в коде. Именованные запросы поддерживают как HQL, так и Native SQL. Для создания Named SQL Query можно использовать JPA аннотации @NamedQuery, @NamedNativeQuery или конфигурационный файл отображения (mapping files). Пример описания и использования Named SQL Query.
20. Преимущества именованных запросов Named SQL Query
Named Query имеют глобальный характер, т.е. заданные в одном месте, доступны в любом месте кода. Синтаксис Named Query проверяется при создании SessionFactory, что позволяет заметить ошибку на раннем этапе, а не при запущенном приложении и выполнении запроса.
Одним из основных недостатков именованного запроса является то, что его сложнее отлаживать. Сложности могут быть связаны с поиском места определения запроса. Поэтому не разбрасывайтесь описанием запросов в различных участках. Можно все связанные с сущностью запросы описать непосредственно в классе, используя аннотацию @NamedQueries, как это показано в следующем коде :
21. Использование org.hibernate.Criteria
Hibernate Criteria API представляет альтернативный подход HQL и позволяет выполнять запросы в БД без написания SQL кода. Для создания экземпляров Criteria используется класс Session. Пример Criteria с необязательным обрамлением в транзакцию :
Приведенный выше запрос вернет первые 10 записей из таблицы сущности User. Метод setMaxResults представляет собой аналог команды LIMIT в SQL-запросе. Чтобы прочитать определенное количество записей с с определенной позиции (LIMIT 2, 15) необходимо дополнительно использовать метод setFirstResult :
Подробнее о org.hibernate.Criteria можно прочитать здесь.
22. Hibernate proxy и ленивая загрузка (lazy load)
Hibernate может использовать прокси для поддержки отложенной загрузки. При соответствующем атрибут fetch аннотации связи (fetch определяет стратегию загрузки дочерних объектов) из базы данных не загружаются связанные объекты. При первом обращении к дочернему объекту с помощью метода get, если связанная сущность отсутствует в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов Entity Bean объектов.
Подробнее об атрибуте загрузки связанных объектов fetch.
23. Каскадные связи
При наличии зависимостей (связей) между сущностями необходимо определить влияние различных операций одной сущности на связанные. Это можно реализовать с помощью аннотации каскадных связей @Cascade. Пример использования @Cascade :
Помните, что имеются некоторые различия между enum CascadeType в Hibernate и в JPA. Поэтому обращайте внимание на импортируемый пакет при использовании аннотации и константы типа. Наиболее часто используемые CascadeType перечисления описаны ниже :
24. Управление транзакциями
Hibernate не допускает большинство операций без использования транзакций. Для начала транзакции необходимо выполнить метод beginTransaction объекта сессии Session, возвращающий ссылку, которую можно использовать для подтверждения или отката транзакции.
Любое вызываемое в Hibernate исключение автоматически вызывает rollback.
SessionFactory в Hibernate 4 для чайников
Пытаюсь разобратся в Hibernate, а именно в SessionFactory. Вот прочитал ответ по поводу создания сесии (https://ru.stackoverflow.com/a/85082/198514):
А вот так мне показывали:
Если найдется человек, который объяснит разницу между подходами и что делает каждый метод, буду очень признателен.
Обновление
1 ответ 1
Первый подход
hibernate.cfg.xml зачитывается здесь configuration.configure()
Вот это applySettings(configuration.getProperties()) необходимо, чтобы не потерять properties из hibernate.cfg.xml (в этом файле можно указывать свойства так же, как в hibernate.properties ). Например, если у Вас там свойства не указаны (а обычно они там не указываются), то достаточно вот этого
NOTE : This will be replaced by use of StandardServiceRegistryBuilder and MetadataSources instead after the 4.0 release at which point this class will become deprecated and scheduled for removal in 5.0. See HHH-6183, HHH-2578 and HHH-6586 for details
Далее, в Hibernate 5, судя по всему, от этой идеи отказались и данного замечания в документации к Configuraton нет.
Второй подход
метод configure() не вызывается, то соответственно, информация о маппинге из файла hibernate.cfg.xml зачитываться не будет. Вообще, этот подход можно рассматривать как неполный вариант третьего подхода.
Третий подход
Этот подход будет работать правильно начиная с версии Hibernate 4.3 (из-за уже упомянутого StandardServiceRegistryBuilder ). Но он содержит избыточность, о которой упомянул @Sergey. Если убрать избыточность, то этот вариант сведется к
Как делать правильнее всего
Правильнее всего делать вот так
Основная причина, на мой взгляд, это то что все вышеперичисленные подходы на будут вообще (!) правильно работать с Hibernate 5. Об этом подробнее можно почитать здесь.
Хотя buildSessionFactory() объявлена как @Deprecated в Hibernate 4, в Hibernate 5 она запилена обратно! Соответственно, вышеприведенный код будет правильно работать во всех версиях Hibernate.
Указание путей к файлам конфигурации
Объект какого класса необходим для создания sessionfactory в hibernate
ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных»
2 Опиши как конфигурируется Hibernate Рассказать про hibernatecfgxml и про mapping
Существует четыре способа конфигурации работы с Hibernate :
3 Жизненный цикл Entiity
4 Зачем нужен класс SessionFactory Является ли он потокобезопасным
Именно из объекта SessionFactory мы получаем объекты типа Session. На все приложение существует только одна SessionFactory и она инициализируеться вместе со стартом приложения. SessionFactory кэширует мета-дату и SQL запросы которые часто используются приложением во время работы. Так же оно кэширует информацию которая была получена в одной из транзакций и может быть использована и в других транзакциях. Обьект SessionFactory можно получить следующим обращением:
Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.
5 Зачем нужен класс Session Является ли он потокобезопасным
Session — это основной интерфейс, который отвечает за связь с базой данных. Так же, он помогает создавать объекты запросов для получение персистентных объектов. (персистентный объект — объект который уже находится в базе данных; объект запроса — объект который получается когда мы получаем результат запроса в базу данных, именно с ним работает приложение). Обьект Session можно получить из SessionFactory:
Роль интерфейса Session:
Жизненный цикл объекта session связан с началом и окончанием транзакции. Этот объект предоставляет методы для CRUD (create, read, update, delete) операций для объекта персистентности. С помощью этого экземпляра можно выполнять HQL, SQL запросы и задавать критерии выборки.
Объект Hibernate Session не является потокобезопасным. Каждый поток должен иметь свой собственный объект Session и закрывать его по окончанию.
6 В чем отличие методов Sessionget Sessionload
Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого — get() и load().
7 Расскажите про методы flush commit
8 В чем отличие методы save от saveOrUpdate и merge
Hibernate save() используется для сохранения сущности в базу данных. Проблема с использованием метода save() заключается в том, что он может быть вызван без транзакции. А следовательно если у нас имеется отображение нескольких объектов, то только первичный объект будет сохранен и мы получим несогласованные данные. Также save() немедленно возвращает сгенерированный идентификатор.
Hibernate persist() аналогичен save() с транзакцией. persist() не возвращает сгенерированный идентификатор сразу.
Hibernate saveOrUpdate() использует запрос для вставки или обновления, основываясь на предоставленных данных. Если данные уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate() можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save().
Hibernate merge() может быть использован для обновления существующих значений, однако этот метод создает копию из переданного объекта сущности и возвращает его. Возвращаемый объект является частью контекста персистентности и отслеживает любые изменения, а переданный объект не отслеживается.
9 Расскажите процесс создания редактирования чтения и удаления данных через Hibernate
10 Как осуществляется иерархия наследования в Hibernate Рассказать про три стратегии наследования
SQL не понимает наследование типов и не поддерживает его.
Всего таких стратегий 4:
11 Можно ли создать собственный тип данных
12 Какие коллекции поддерживаются на уровне mapping
Своей реализации тип коллекции Bag очень напоминает Set, разница состоит в том, что Bag может хранить повторяющиеся значения. Bag хранит непроиндексированный список элементов. Большинство таблиц в базе данных имеют индексы отображающие положение элемента данных один относительно другого, данные индексы имеют представление в таблице в виде отдельной колонки. При объектно-реляционном маппинге, значения колонки индексов мапится на индекс в Array, на индекс в List или на key в Map. Если вам надо получить коллекцию объектов не содержащих данные индексы, то вы можете воспользоваться коллекциями типа Bag или Set (коллекции содержат данные в неотсортированном виде, но могут быть отсортированы согласно запросу).
13 Зачем нужен класс Transactional
Transaction (org.hibernate.Transaction) — однопоточный короткоживущий объект, используемый для атомарных операций. Это абстракция приложения от основных JDBC или JTA транзакций. org.hibernate.Session может занимать несколько org.hibernate.Transaction в определенных случаях.
Вместо вызовов session.openTransaction() и session.commit() используется аннотация @Transactional
14 Расскажите про уровни изоляции Какие уровни поддерживаются в hibernate Как их устанавливать
They’re 4 mains transaction’s isolation levels:
Hibernate starts the transactions by calling getTransaction() (JPA’s implementation) or beginTransaction() (Hibernate’s Session) methods. According to used persistence mechanism, a transaction can be an instance of javax.persistence.EntityTransaction (for JPA) or org.hibernate.Transaction (for Hibernate’s Session). Both transaction are begun with begin() method, rollbacked thanks to rollback() one and commited through commit() invocation.
To configure transactions isolation level in Hibernate, we need to change the property called hibernate.connection.isolation. This property can take one from following entries:
Normally, the isolation level is set at java.sql.Connection level, through setTransactionIsolation(int level) method. Level passed in parameter should be one from Connection’s constants:
15 Что такое OplimisticLock Расскажите стратегии создания через version timestamp
it’s crucial to manage concurrent access to a database properly. We should be able to handle multiple transactions in an effective and most importantly, error-proof way. To achieve that we can use optimistic locking mechanism.
In order to use optimistic locking, we need to have an entity including a property with @Version annotation. While using it, each transaction that reads data holds the value of the version property. Before the transaction wants to make an update, it checks the version property again. If the value has changed in the meantime an OptimisticLockException is thrown. Otherwise, the transaction commits the update and increments a value version property.
As we’ve said before, optimistic locking is based on detecting changes on entities by checking their version attribute. If any concurrent update takes place, OptmisticLockException occurs. After that, we can retry updating the data.
We can imagine that this mechanism is suitable for applications which do much more reads than updates or deletes. What is more, it’s useful in situations where entities must be detached for some time and locks cannot be held.
On the contrary, pessimistic locking mechanism involves locking entities on the database level.
Each transaction can acquire a lock on data. As long as it holds the lock, no transaction can read, delete or make any updates on the locked data. We can presume that using pessimistic locking may result in deadlocks. However, it ensures greater integrity of data than optimistic locking.
Version attributes are properties with @Version annotation. They are necessary for enabling optimistic locking.
16 Расскажите про стратегии извлечения данных urgy lazy
17 Что такое объект Proxy С чем связана ошибка LazyInitializationException Как ее избежать
Hibernate использует прокси объект для поддержки отложенной загрузки. Обычно при загрузке данных из таблицы Hibernate не загружает все отображенные (замаппинные) объекты. Как только вы ссылаетесь на дочерний объект или ищите объект с помощью геттера, если связанная сущность не находиться в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов ваших entity объектов.
Hibernate поддерживает ленивую инициализацию используя proxy объекты и выполняет запросы к базе данных только по необходимости.
fetch = FetchType.LAZY это значит, что хибернейт не будет инициализировать эти поля пока вы к ним не обратитесь. Но т.к. вы обращаетесь к этим полям за пределами транзакционных методов, он не может это сделать и выкидывает ошибку. Чтобы этого избежать надо, что метод, который обращается к этим полям был с аннотацей Transactional
Или как предложили в комментариях: Hibernate.initialize(owner.getBooks());
Это хак, но он заставит хибернейт инициировать коллекцию. НО! Возможно это не всегда надо и тогда надо выбрать первый вариант и отталкиваться от здравого смысла, смотреть, где надо навешивать аннотацию, а где нет.
18 HQL Расскажи основные элементы синтаксиса HQL Простой запрос запрос join Создания объекта через конструтор
Hibernate Framework поставляется с мощным объектно-ориентированным языком запросов — Hibernate Query Language (HQL). Он очень похож на SQL, за исключением, что в нем используются объекты вместо имен таблиц, что делает язык ближе к объектно-ориентированному программированию.
HQL является регистронезависимым, кроме использования в запросах имен java переменных и классов, где он подчиняется правилам Java. Например, SelECt то же самое, что и select, но ru.javastudy.MyClass отличен от ru.javastudy.MyCLASS. Запросы HQL кэшируются (это как плюс так и минус).
For example, if we have these two queries
In this two queries, you are using JOIN to query all employees that have at least one department associated. But, the difference is: in the first query you are returning only the Employes for the Hibernate. In the second query, you are returning the Employes and all Departments associated. So, if you use the second query, you will not need to do a new query to hit the database again to see the Departments of each Employee. You can use the second query when you are sure that you will need the Department of each Employee. If you not need the Department, use the first query.
19 Расскажите про уровни кешей в hibernate
Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных.
Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш. Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны.
20 Что такое StatelessSessionFactory Зачем он нужен где он используется
StatelessSession – командно-ориентированный API, предоставляемый Hibernate. Используйте его для потоковой передачи данных в базу и из нее в форме отсоединенных (detached) объектов. StatelessSession не имеет ассоциированного persistence-контекста и не предоставляет большую часть высокоуровневой семантики.
21 Зачем нужен решим read only
You might actually have reasons to mark transactions as read-only.
Назовите некоторые важные аннотации используемые для отображения в Hibernate
Hibernate поддерживает как аннотации из JPA, так и свои собственные, которые находятся в пакете org.hibernate.annotations. Наиболее важные аннотации JPA и Hibernate:
Как реализованы Join’ы Hibernate
Существует несколько способов реализовать связи в Hibernate.
Почему мы не должны делать Entity class как final
Хибернейт использует прокси классы для ленивой загрузки данных (т.е. по необходимости, а не сразу). Это достигается с помощью расширения entity bean и, следовательно, если бы он был final, то это было бы невозможно. Ленивая загрузка данных во многих случаях повышает производительность, а следовательно важна.
Что такое Query Cache в Hibernate
Hibernate реализует область кэша для запросов resultset, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции требуется несколько дополнительных шагов в коде. Query Cache полезны только для часто выполняющихся запросов с повторяющимися параметрами. Для начала необходимо добавить эту запись в файле конфигурации Hibernate:
Уже внутри кода приложения для запроса применяется метод setCacheable(true), как показано ниже:
Что такое Named SQL Query
Hibernate поддерживает именованный запрос, который мы можем задать в каком-либо центральном месте и потом использовать его в любом месте в коде. Именованные запросы поддерживают как HQL, так и Native SQL. Создать именованный запрос можно с помощью JPA аннотаций @NamedQuery, @NamedNativeQuery или в конфигурационном файле отображения (mapping files).
Каковы преимущества Named SQL Query
Именованный запрос Hibernate позволяет собрать множество запросов в одном месте, а затем вызывать их в любом классе. Синтаксис Named Query проверяется при создании session factory, что позволяет заметить ошибку на раннем этапе, а не при запущенном приложении и выполнении запроса. Named Query глобальные, т.е. заданные однажды, могут быть использованы в любом месте.
Однако одним из основных недостатков именованного запроса является то, что его очень трудно отлаживать (могут быть сложности с поиском места определения запроса).
Расскажите о преимуществах использования Hibernate Criteria API
Hibernate Criteria API является более объектно-ориентированным для запросов, которые получают результат из базы данных. Для операций update, delete или других DDL манипуляций использовать Criteria API нельзя. Критерии используются только для выборки из базы данных в более объектно-ориентированном стиле.
Вот некоторые области применения Criteria API:
Как логировать созданные Hibernate SQL запросы в лог файлы
Для логирования запросов SQL добавьте в файл конфигурации Hibernate строчку:
Отметьте, что это необходимо использовать на уровне Development или Testing и должно быть отключено в продакшн.
Как реализованы отношения в Hibernate
Реализовать отношение one-to-one, one-to-many, many-to-many можно с помощью JPA аннотаций или конфигурирования xml файла. За примерами посетите раздел Hibernate.
Как управлять транзакциями с помощью Hibernate
Hibernate вообще не допускает большинство операций без использования транзакций. Поэтому после получения экземпляра session от SessionFactory необходимо выполнить beginTransaction() для начала транзакции. Метод вернет ссылку, которую мы можем использовать для подтверждения или отката транзакции.
В целом, управление транзакциями в фреймворке выполнено гораздо лучше, чем в JDBC, т.к. мы не должны полагаться на возникновение исключения для отката транзакции. Любое исключение автоматически вызовет rollback.
Что такое каскадные связи обновления и какие каскадные типы есть в Hibernate
Если у нас имеются зависимости между сущностями (entities), то нам необходимо определить как различные операции будут влиять на другую сущность. Это реализуется с помощью каскадных связей (или обновлений). Вот пример кода с использованием аннотации @Cascade:
Обратите внимание, что есть некоторые различия между enum CascadeType в Hibernate и в JPA. Поэтому обращайте внимание какой пакет вы импортируете при использовании аннотации и константы типа. Наиболее часто используемые CascadeType перечисления описаны ниже.
None: без Cascading. Формально это не тип, но если мы не указали каскадной связи, то никакая операция для родителя не будет иметь эффекта для ребенка.
Какие паттерны применяются в Hibernate
Расскажите о Hibernate Validator Framework
Проверка данных является неотъемлемой частью любого приложения. Hibernate Validator обеспечивает эталонную реализацию двух спецификаций JSR-303 и JSR-349 применяемых в Java. Для настройки валидации в Hibernate необходимо сделать следующие шаги.
Добавить hibernate validation зависимости в проект.
Так же требуются зависимости из JSR 341, реализующие Unified Expression Language для обработки динамических выражений и сообщений о нарушении ограничений.
Использовать необходимые аннотации в бинах.
Best Practices в Hibernate
При использовании фреймворка Hibernate рекомендуется придерживаться некоторых правил.