Hibernate Flashcards Preview

Java > Hibernate > Flashcards

Flashcards in Hibernate Deck (34)
Loading flashcards...
1

Hibernate Framework?

библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping — ORM)

2

преимущества и недостатки Hibernate Framework?

- устраняет повторяющийся код как в JDBC
- HQL.
- open source.Hibernate легко
- ленивую инициализацию
- разные уровни cache
- транзакции

-чем сложнее запрос - тем сложнее его писать средствами ORM

3

важные интерфейсы Hibernate

неизменяемый потокобезопасный SessionFactory для получения однопоточных короткоживущих объектов Session, которые используются для операций с базами данных.Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction.

4

Что такое конфигурационный файл Hibernate?

Файл конфигурации Hibernate содержит в себе данные о базе данных и необходим для инициализации SessionFactory. В .xml файле

5

Hibernate mapping file

используется для связи entity бинов и колонок в таблице базы данных. В случаях, когда не используются аннотации JPA

6

Hibernate SessionFactory и как его сконфигурировать

является фабрикой классов и используется для получения объектов session.
отвечает за считывание параметров конфигурации Hibernate и подключение к базе данных.
Обычно в приложении имеется только один экземпляр SessionFactory и потоки, обслуживающие клиентские запросы, получают экземпляры session с помощью объекта SessionFactory.
Внутреннее состояние SessionFactory неизменно (immutable).
Internal state (внутреннее состояние) включает в себя все метаданные об Object/ Relational Mapping и задается при создании SessionFactory.

7

Является ли Hibernate SessionFactory потокобезоспансым

Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.

8

Hibernate Session

является мостом между приложением и Hibernate. С помощью сессий выполняются все CRUD-операции с объектами-сущностями. Объект типа Session получают из экземпляра типа org.hibernate.SessionFactory, который должен присутствовать в приложении в виде singleton.

9

Является ли Hibernate Session потокобезоспаным?

Объект Hibernate Session не является потокобезопасным. Каждый поток должен иметь свой собственный объект Session и закрывать его по окончанию.

10

В чем разница между openSession и getCurrentSession?

Hibernate SessionFactory getCurrentSession() нужно настроить его в конфигурационном файле hibernate. Объект session закрывается вместе с закрытием SessionFactory.


Метод Hibernate SessionFactory openSession() всегда создает новую сессию. Мы должны обязательно контролировать закрытие объекта сеанса по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект session для каждого запроса.

Существует еще один метод openStatelessSession(), который возвращает session без поддержки состояния. Такой объект не реализует первый уровень кэширования и не взаимодействует с вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий. Такие объекты могут быть полезны при загрузке больших объемов данных без удержания большого кол-ва информации в кэше.

11

Hibernate Session get() и load()

Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого — get() и load().

get() загружает данные сразу при вызове, в то время как load() использует прокси объект и загружает данные только тогда, когда это требуется на самом деле. В этом плане load() имеет преимущество в плане ленивой загрузки данных.
load() бросает исключение, когда данные не найдены. Поэтому его нужно использовать только при уверенности в существовании данных.
Нужно использовать метод get(), если необходимо удостовериться в наличии данных в БД.

12

кэширование в Hibernate

Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных.

Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш.
Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны.

13

Как настроить кэш второго уровня в Hibernate с помощью EHCache?

Добавить зависимость dependency в проект. Добавить несколько записей в конфигурационный файл Hibernate/ Создать файл конфигурации EHCache.
расставить аннотации
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="employee")
public class Address {}

Он хранит информацию в виде массивов строк, чисел и т. д. И идентификатор объекта выступает указателем на эту информацию. Концептуально это нечто вроде Map, в которой id объекта — ключ, а массивы данных — значение. Приблизительно можно представить себе это так:
1 -> { "Pupkin", 1, null , {1,2,5} }

14

состояния у entity bean?

Transient: не связан сессией. Может стать персистентным при вызове метода save(), persist() ,saveOrUpdate(), merge

Persistent: связан с сессией. Это любой экземпляр, возвращаемый методами get() или load().
ПРи delete() перейдет в Transient

Detached: был персистентным, но сейчас не связан с сессией. Такой объект можно сделать персистентным используя методы update(), saveOrUpdate(), lock() или replicate(). может перейти в состояние persistent после вызова метода merge().

15

Hibernate Session merge()?

Hibernate merge() может быть использован для обновления существующих значений, преобразует объект из transient или detached в persistent. Если из transient, то работает аналогично persist() (генерирует для объекта новый Id, даже если он задан), если из detached — загружает объект из БД, присоединяет к сессии, а при сохранении выполняет запрос update

16

Hibernate save()

используется для сохранения сущности в базу данных. Проблема с использованием метода save() заключается в том, что он может быть вызван без транзакции. А следовательно если у нас имеется отображение нескольких объектов, то только первичный объект будет сохранен и мы получим несогласованные данные. Также save() немедленно возвращает сгенерированный идентификатор
Object может быть в статусе transient или detached

17

Hibernate persist()

аналогичен save() с транзакцией. persist() не возвращает сгенерированный идентификатор сразу.

18

Hibernate saveOrUpdate()

использует запрос для вставки или обновления, основываясь на предоставленных данных. Если данные уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate() можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save().

19

Какие типы коллекций в Hibernate вы знаете?

Bag
Set
List
Array
Map

20

Как реализованы Join’ы Hibernate?

Я использовал one-to-one, one-to-many, many-to-many. и прямые sql запросы

21

Query Cache в Hibernate?

Hibernate реализует область кэша для запросов resultset, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции требуется несколько дополнительных шагов в коде. Query Cache полезны только для часто выполняющихся запросов с повторяющимися параметрами. Для начала необходимо добавить эту запись в файле конфигурации Hibernate:


true
Уже внутри кода приложения для запроса применяется метод setCacheable(true), как показано ниже:

Query query = session.createQuery("from Employee");
query.setCacheable(true);
query.setCacheRegion("ALL_EMP");

22

Hibernate Criteria API

Hibernate Criteria API является более объектно-ориентированным для запросов, которые получают результат из базы данных. Для операций update, delete или других DDL манипуляций использовать Criteria API нельзя. Критерии используются только для выборки из базы данных в более объектно-ориентированном стиле.
Criteria API поддерживает проекцию, которую мы можем использовать для агрегатных функций вроде sum(), min(), max() и т.д.
Criteria API может использовать ProjectionList для извлечения данных только из выбранных колонок.
Criteria API может быть использована для join запросов с помощью соединения нескольких таблиц, используя методы createAlias(), setFetchMode() и setProjection().
Criteria API поддерживает выборку результатов согласно условиям (ограничениям). Для этого используется метод add() с помощью которого добавляются ограничения (Restrictions).
Criteria API позволяет добавлять порядок (сортировку) к результату с помощью метода addOrder().

23

Что вы знаете о Hibernate прокси

Hibernate использует прокси объект для поддержки отложенной загрузки. Обычно при загрузке данных из таблицы Hibernate не загружает все отображенные (замаппинные) объекты. Как только вы ссылаетесь на дочерний объект или ищите объект с помощью геттера, если связанная сущность не находиться в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов ваших entity объектов.

24

КАскадные связи

@Cascade(value = org.hibernate.annotations.CascadeType.ALL)

25

Стратегии кеша

определяют поведения кеша в определенных ситуациях

readOnly
readWrite (!)не используется при уровне изоляции Seriazable
nonstrict Read-write нестрогое при редком обновлении данных
transactional

26

Провайдеры кэша

EaCache - отлично для кеша второго уровня, быстрый read-write и read only, кеширование на диск и память. Не поддерживает кластеризацию.

OpenSymphoneCache (OSCache) тоже что и EACache но поддерживает кластеризацию

SwarmCache -кеширование на кластеризации, readOnly и nonstriict; где readwrite

TreeCache readOnly для стратегии transactional

27

Что такое кеш запросов

Кэш запросов выглядит концептуально как хэш мапа, где
ключом выступает композиция из текста запроса и
значений параметров, и значение это список Id
сущностей, которые подходят запросу:["from Person where firstName=?", ["Joey"] ] -> [1, 2] ]

Некоторые запросы не возвращают сущности,
вместо них они возвращают только примитивные
значения. В этом случае сами значения будут
сохранены в кэше запросов.

28

Транзакции в hibernate

мы использовали Spring Framework. Вместо вызовов session.openTransaction() и session.commit() используется аннотация @Transactional

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {ObjectNotFoundException.class, ConstraintViolationException.class})
public Long saveTask(Long userId) {

Менеджер транзакций открывает новую транзакцию и создаёт для неё экземпляр Session,

Все методы, которые вызываются в методе с данной аннотацией, также имеют доступ к этой транзакции,

rollbackFor указывает исключения, при выбросе которых должен быть произведён откат транзакции.

propagation указывает что делать с транзакцией есть есть сществующа...там несколько вариантов типа под транзакция, вне транзакции или в пределах той же.

29

session.evict

session.evict - удалить обьект из кеша
и отсоединить от сессии

30

Hibernate 3 уровня кеширования:

Кеш первого уровня (First-level cache);
Кеш второго уровня (Second-level cache);
Кеш запросов (Query cache);