Hibernate Flashcards
Hibernate Framework?
библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping — ORM)
преимущества и недостатки Hibernate Framework?
- устраняет повторяющийся код как в JDBC
- HQL.
- open source.Hibernate легко
- ленивую инициализацию
- разные уровни cache
- транзакции
-чем сложнее запрос - тем сложнее его писать средствами ORM
важные интерфейсы Hibernate
неизменяемый потокобезопасный SessionFactory для получения однопоточных короткоживущих объектов Session, которые используются для операций с базами данных.Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction.
Что такое конфигурационный файл Hibernate?
Файл конфигурации Hibernate содержит в себе данные о базе данных и необходим для инициализации SessionFactory. В .xml файле
Hibernate mapping file
используется для связи entity бинов и колонок в таблице базы данных. В случаях, когда не используются аннотации JPA
Hibernate SessionFactory и как его сконфигурировать
является фабрикой классов и используется для получения объектов session.
отвечает за считывание параметров конфигурации Hibernate и подключение к базе данных.
Обычно в приложении имеется только один экземпляр SessionFactory и потоки, обслуживающие клиентские запросы, получают экземпляры session с помощью объекта SessionFactory.
Внутреннее состояние SessionFactory неизменно (immutable).
Internal state (внутреннее состояние) включает в себя все метаданные об Object/ Relational Mapping и задается при создании SessionFactory.
Является ли Hibernate SessionFactory потокобезоспансым
Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.
Hibernate Session
является мостом между приложением и Hibernate. С помощью сессий выполняются все CRUD-операции с объектами-сущностями. Объект типа Session получают из экземпляра типа org.hibernate.SessionFactory, который должен присутствовать в приложении в виде singleton.
Является ли Hibernate Session потокобезоспаным?
Объект Hibernate Session не является потокобезопасным. Каждый поток должен иметь свой собственный объект Session и закрывать его по окончанию.
В чем разница между openSession и getCurrentSession?
Hibernate SessionFactory getCurrentSession() нужно настроить его в конфигурационном файле hibernate. Объект session закрывается вместе с закрытием SessionFactory.
Метод Hibernate SessionFactory openSession() всегда создает новую сессию. Мы должны обязательно контролировать закрытие объекта сеанса по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект session для каждого запроса.
Существует еще один метод openStatelessSession(), который возвращает session без поддержки состояния. Такой объект не реализует первый уровень кэширования и не взаимодействует с вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий. Такие объекты могут быть полезны при загрузке больших объемов данных без удержания большого кол-ва информации в кэше.
Hibernate Session get() и load()
Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого — get() и load().
get() загружает данные сразу при вызове, в то время как load() использует прокси объект и загружает данные только тогда, когда это требуется на самом деле. В этом плане load() имеет преимущество в плане ленивой загрузки данных.
load() бросает исключение, когда данные не найдены. Поэтому его нужно использовать только при уверенности в существовании данных.
Нужно использовать метод get(), если необходимо удостовериться в наличии данных в БД.
кэширование в Hibernate
Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных.
Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш.
Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны.
Как настроить кэш второго уровня в Hibernate с помощью EHCache?
Добавить зависимость dependency в проект. Добавить несколько записей в конфигурационный файл Hibernate/ Создать файл конфигурации EHCache.
расставить аннотации
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”employee”)
public class Address {}
Он хранит информацию в виде массивов строк, чисел и т. д. И идентификатор объекта выступает указателем на эту информацию. Концептуально это нечто вроде Map, в которой id объекта — ключ, а массивы данных — значение. Приблизительно можно представить себе это так:
1 -> { “Pupkin”, 1, null , {1,2,5} }
состояния у entity bean?
Transient: не связан сессией. Может стать персистентным при вызове метода save(), persist() ,saveOrUpdate(), merge
Persistent: связан с сессией. Это любой экземпляр, возвращаемый методами get() или load().
ПРи delete() перейдет в Transient
Detached: был персистентным, но сейчас не связан с сессией. Такой объект можно сделать персистентным используя методы update(), saveOrUpdate(), lock() или replicate(). может перейти в состояние persistent после вызова метода merge().
Hibernate Session merge()?
Hibernate merge() может быть использован для обновления существующих значений, преобразует объект из transient или detached в persistent. Если из transient, то работает аналогично persist() (генерирует для объекта новый Id, даже если он задан), если из detached — загружает объект из БД, присоединяет к сессии, а при сохранении выполняет запрос update