Hibernate Flashcards

1
Q

Hibernate Framework?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

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

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Hibernate mapping file

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Hibernate Session

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

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

A

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

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Hibernate Session get() и load()

A

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

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

A

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

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

A

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

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

A

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

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Hibernate Session merge()?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Hibernate save()

A

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

17
Q

Hibernate persist()

A

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

18
Q

Hibernate saveOrUpdate()

A

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

19
Q

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

A
Bag
Set
List
Array
Map
20
Q

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

A

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

21
Q

Query Cache в Hibernate?

A

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

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

Query query = session.createQuery(“from Employee”);

query. setCacheable(true);
query. setCacheRegion(“ALL_EMP”);

22
Q

Hibernate Criteria API

A

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
Q

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

A

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

24
Q

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

A

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

25
Q

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

A

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

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

26
Q

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

A

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

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

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

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

27
Q

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

A

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

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

28
Q

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

A

мы использовали 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
Q

session.evict

A

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

и отсоединить от сессии

30
Q

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

A

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

31
Q

Транзакции в базах данных соответствуют

свойствам ACID:

A
Атомарность — транзакция может быть либо
целиком выполнена, либо целиком
отменена.
Согласованность — состояние данных
должно быть логически согласованным после
выполнения (или отмены)
транзации
Изолированность — в процессе работы
транзакции другие выполняющиеся в это время
транзакции не влияют на неё.
наДёжность — что-бы
не произошло, транзакция останется атомарной.
32
Q

HQL и преймущества

A

Единственное преимущество, о котором я могу думать, это то, что запросы ORM обычно кэшируются на уровне (подготовленных) операторов, поэтому, если вы делаете один и тот же запрос много раз, возможно, вы повторно используете подготовленный оператор.

33
Q

Поле привязать к полю из БД

A

@Formula(“(select count(gt.*) FROM GroupTab gt WHERE gt.parent_id=id)”)
private Long countChildrens;

34
Q

как сделать типа
select * from table where id in(select id from othertable)
запрос через hsql

A

так и писать, можно еще через Join там говорят быстрее, но не тестировал