Проект

Общее

Профиль

ORM » История » Версия 3

Александр Александров, 23.04.2019 21:52

1 1 Александр Александров
h1. ORM
2
3
h2. Вопросы
4
5
# Что такое Hibernate?
6
# Что такое ORM?
7
# Какие преимущства от использования Hibernate Framework?
8
# Как Hibernate помогает в программировании?
9
# Какие преимущества Hibernate над JDBC?
10
# Что такое конфигурационный файл Hibernate?
11
# Способы конфигурации работы с Hibernate.
12 3 Александр Александров
# Что такое Hibernate mapping file?
13 1 Александр Александров
# Что такое Переходные объекты (Transient Objects)?
14
# Что такое постоянные объекты (Persistent objects)?
15
# Что такое TransactionFactory?
16
# Что такое ConnectionProvider?
17
# Что такое Трансакция (Transaction)?
18
# Какие существуют стратегии загрузки объектов в Hibernate?
19
# Какие бывают id generator классы в Hibernate?
20
# Какие ключевые интерфейсы использует Hibernate?
21
# Назовите некоторые важные аннотации, используемые для отображения в Hibernate.
22
# Какая роль интерфейса Session в Hibernate?
23
# Является ли Hibernate Session потокобезоспаным?
24
# Какая роль интерфейса SessionFactory в Hibernate?
25
# Является ли Hibernate SessionFactory потокобезоспансым?
26
# В чем разница между openSession и getCurrentSession?
27
# Какие типы коллекций представлены в Hibernate?
28
# Какие типы менеджмента транзакций поддерживаются в Hibernate?
29
# Что собой являет коллекция типа Bag и зачем она используется?
30
# Какие типы кэша используются в Hibernate?
31
# Какие существуют типы стратегий кэша?
32
# Что вы знаете о кэширование в Hibernate? Объясните понятие кэш первого уровня в Hibernate?
33
# Как настраивается кэш второго уровня в Hibernate?
34
# Какая разница в работе методов load(); и get();?
35
# Каковы существуют различные состояния у entity bean?
36
# Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean?
37
# Как используется вызов метода Hibernate Session merge()?
38
# В чем разница между Hibernate save(), saveOrUpdate() и persist()?
39
# Что такое Lazy fetching(изъятие) в Hibernate?
40
# В чем разница между sorted collection и ordered collection? Какая из них лучше?
41
# Как реализованы Join’ы Hibernate?
42
# Почему мы не должны делать Entity class как Ùnal?
43
# Что вы знаете о HQL и каковы его преимущества?
44
# Что такое Query Cache в Hibernate?
45
# Можем ли мы выполнить SQL (sql native) запрос в Hibernate?
46 3 Александр Александров
# НАЗОВИТЕ ПРЕИМУЩЕСТВА ПОДДЕРЖКИ НАТИВНОГО SQL В HIBERNATE.
47 1 Александр Александров
# Что такое Named SQL Query?
48
# Каковы преимущества Named SQL Query?
49
# Как добавить логирование log4j в Hibernate приложение?
50
# Как логировать созданные Hibernate SQL запросы в лог-файлы?
51
# Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)?
52
# Как управлять транзакциями с помощью Hibernate?
53
# Что такое каскадные связи (обновления) в Hibernate?
54
# Какие каскадные типы есть в Hibernate?
55
# Что такое сесиия и фаблика сессий в Hibernate? Как настроить session factory в конфигурационном файле Spring?
56
# Как использовать JNDI DataSource сервера приложений с Hibernate Framework?
57
# Как интегрировать Hibernate и Spring?
58
# Какие паттерны применяются в Hibernate?
59
# Расскажите о Hibernate Validator Framework.
60
# Какие преимущества дает использование плагина Hibernate Tools Eclipse?
61
62
h2. Ответы
63
64
h3. Что такое Hibernate?
65
66 2 Александр Александров
Это фреймворк для объектно-реляционного отображения сущностей в традиционные реляционные базу данных.
67
68
Основные возможности фреймворка:
69
70
* Автоматическая генерация и обновление таблиц в базах данных;
71
* Поскольку основные запросы к базе данных (сохранение, обновление, удаление и поиск) представлены как методы фрейморка, то значительно сокращается код, который пишется разработчиком;
72
* Обеспечивает использование SQL подобного языка (HQL - hibernate query language). Запросы HQL могут быть записаны рядом объектами данных (POJO классы подготовленные для работы с базой данных).
73
74 1 Александр Александров
h3. Что такое ORM?
75
76 2 Александр Александров
ORM (англ. Object-relational mapping, рус. Объектно-реляционное отображение) - технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая "виртуальную объектную базу данных".
77
78 1 Александр Александров
h3. Какие преимущства от использования Hibernate Framework?
79
80 2 Александр Александров
Некоторые из них:
81
82
* Устраняет множество повторяющегося кода, который постоянно преследует разработчика при работе с JDBC. Скрывает от разработчика множество кода, необходимого для управления ресурсами и позволяет сосредоточиться на бизнес логике.
83
* Поддерживает XML так же как и JPA аннотации, что позволяет сделать реализацию кода независимой.
84
* Предоставляет собственный мощный язык запросов (HQL), который похож на SQL. Стоит отметить, что HQL полностью объектно-ориентирован и понимает такие принципы, как наследование, полиморфизм и ассоциации (связи).
85
* Hibernate легко интегрируется с другими Java EE фреймворками, например, Spring Framework поддерживает встроенную интеграцию с Hibernate.
86
* Поддерживает ленивую инициализацию используя proxy объекты и выполняет запросы к базе данных только по необходимости.
87
* Поддерживает разные уровни cache, а следовательно может повысить производительность.
88
* Важно, что Hibernate может использовать чистый SQL, а значит поддерживает возможность оптимизации запросов и работы с любым сторонним вендором БД.
89
* Hibernate - open source проект. Благодаря этому доступны тысячи открытых статей, примеров, а так же документации по использованию фреймворка.
90
91 1 Александр Александров
h3. Как Hibernate помогает в программировании?
92
93 2 Александр Александров
Hibernate реализует ряд фичь которые значительно упрощают работу разработчика.
94
95
* Одной из таких фичь является то, что hibernate позволяет разработчику избежать написания большинства SQL запросов (они уже реализованы , вам надо просто использовать методы которые предоставляет фреймворк).
96
* Под бортом у Hibernate есть куча полезных инструментов которые значительно ускоряют работу приложения, самыми примечательными из них являются двухуровневое кэширования и тонкие настройки lazy и fetch изъятия.
97
* Сам генерирует таблицы в базу данных.
98
99 1 Александр Александров
h3. Какие преимущества Hibernate над JDBC?
100
101 2 Александр Александров
Hibernate имеет ряд преимуществ перед JDBC API:
102
103
* Hibernate удаляет множество повторяющегося кода из JDBC API, а следовательно его легче читать, писать и поддерживать.
104
* Hibernate поддерживает наследование, ассоциации и коллекции, что не доступно в JDBC API.
105
* Hibernate неявно использует управление транзакциями. Большинство запросов нельзя выполнить вне транзакции. При использовании JDBC API для управления транзакциями нужно явно использовать commit и rollback.
106
* JDBC API throws SQLException, которое относится к проверяемым исключениям, а значит необходимо постоянно писать множество блоков try-catch. В большинстве случаев это не нужно для каждого вызова JDBC и используется для управления транзакциями. Hibernate оборачивает исключения JDBC через непроверяемые JDBCException или HibernateException, а значит нет необходимости проверять их в коде каждый раз. Встроенная поддержка управления транзакциями в Hibernate убирает блоки try-catch.
107
* Hibernate Query Language (HQL) более объектно ориентированный и близкий к Java язык программирования, чем SQL в JDBC.
108
* Hibernate поддерживает кэширование, а запросы JDBC - нет, что может понизить производительность.
109
* Hibernate предоставляет возможность управления БД (например создания таблиц), а в JDBC можно работать только с существующими таблицами в базе данных. Конфигурация Hibernate позволяет использовать JDBC вроде соединения по типу JNDI DataSource для пула соединений. Это важная фича для энтерпрайз приложений, которая полностью отсутствует в JDBC API.
110
* Hibernate поддерживает аннотации JPA, а значит код является переносимым на другие ORM фреймворки, реализующие стандарт, в то время как код JDBC сильно привязан к приложению.
111
112 1 Александр Александров
h3. Что такое конфигурационный файл Hibernate?
113
114 2 Александр Александров
Файл конфигурации Hibernate содержит в себе данные о базе данных и необходим для инициализации SessionFactory. В .xml файле необходимо указать вендора базы данных или JNDI ресурсы, а так же информацию об используемом диалекте, что поможет hibernate выбрать режим работы с конкретной базой данных.
115
116 1 Александр Александров
h3. Способы конфигурации работы с Hibernate.
117
118 2 Александр Александров
Существует четыре способа конфигурации работы с Hibernate:
119 1 Александр Александров
120 2 Александр Александров
* используя аннотации;
121
* hibernate.cfg.xml;
122
* hibernate.properties;
123
* persistence.xml.
124
125
Самый частый способ конфигурации: через аннотации и файл persistence.xml, что касается файлов hibernate.properties и hibernate.cfg.xml, то hibernate.cfg.xml главнее (если в приложение есть оба файла, то принимаются настройки из файла hibernate.cfg.xml). Конфигурация аннотациями, хоть и удобна, но не всегда возможна, к примеру, если для разных баз данных или для разных ситуаций вы хотите иметь разные конфигурацию сущностей, то следует использовать xml файлы конфигураций.
126
127
h3. Что такое Hibernate mapping file?
128
129
Файл отображения (mapping file) используется для связи entity бинов и колонок в таблице базы данных. В случаях, когда не используются аннотации JPA, файл отображения .xml может быть полезен (например при использовании сторонних библиотек).
130
131 1 Александр Александров
h3. Что такое Переходные объекты (Transient Objects)?
132
133 2 Александр Александров
Экземпляры долгоживущих классов, которые в настоящее время не связаны c Cессией. Они, возможно, были инициализированы в приложении и еще не сохранены, или же они были инициализированы закрытой Cессией.
134
135 1 Александр Александров
h3. Что такое постоянные объекты (Persistent objects)?
136
137 2 Александр Александров
Короткоживущие, однопоточные объекты, содержащие постоянное состояние и бизнес-функции. Это могут быть простые Java Beans/POJOs (Plain Old Java Object). Они связаны только с одной Cессией. После того, как Cессия закрыта, они будут отделены и свободны для использования в любом протоколе прикладного уровня (например, в качестве объектов передачи данных в и из представления).
138
139 1 Александр Александров
h3. Что такое TransactionFactory?
140
141 2 Александр Александров
Фабрика для экземпляров Transaction. Интерфейс не открыт для приложения, но может быть расширен или реализован разработчиком.
142
143 1 Александр Александров
h3. Что такое ConnectionProvider?
144
145 2 Александр Александров
Фабрика и пул JDBC соединений. Интерфейс абстрагирует приложение от основного источника данных или диспетчера драйверов. Он не открыт для приложения, но может быть расширен или реализован разработчиком.
146 1 Александр Александров
147 2 Александр Александров
h3. Что такое Транзакция (Transaction)?
148
149
Однопоточный, короткоживущий объект, используемый приложением для указания atomic переменных работы. Он абстрагирует приложение от основных JDBC, JTA или CORBA транзакций. Сессия может охватывать несколько Транзакций в некоторых случаях. Тем не менее, разграничение транзакций, также используемое в основах API или Transaction, всегда обязательно.
150
151 1 Александр Александров
h3. Какие существуют стратегии загрузки объектов в Hibernate?
152
153 2 Александр Александров
Существуют следующие типа fetch'a:
154
155
* Join fetching: hibernate получает ассоциированные объекты и коллекции одним SELECT используя OUTER JOIN.
156
* Select fetching: использует уточняющий SELECT чтобы получить ассоциированные объекты и коллекции. Если вы не установите lazy fetching определив lazy="false", уточняющий SELECT будет выполнен только когда вы запрашиваете доступ к ассоциированным объектам.
157
* Subselect fetching: поведение такое же, как у предыдущего типа, за тем исключением, что будут загружены ассоциации для все других коллекций, "родительским" для которых является сущность, которую вы загрузили первым SELECT’ом.
158
* Batch fetching: оптимизированная стратегия вида select fetching. Получает группу сущностей или коллекций в одном SELECT’е.
159
160 1 Александр Александров
h3. Какие бывают id generator классы в Hibernate?
161
162 2 Александр Александров
increment - генерирует идентификатор типа long, short или int, которые будет уникальным только в том случае, если другой процесс не добавляет запись в эту же таблицу в это же время.
163
164
* identity - генерирует идентификатор типа long, short или int. Поддерживается в DB2, MySQL, MS SQL Server, Sybase и HypersonicSQL.
165
* sequence - использует последовательности в DB2, PostgreSQL, Oracle, SAP DB, McKoi или генератор Interbase. Возвращает идентификатор типа long, short или int.
166
* hilo - использует алгоритм hi/lo для генерации идентификаторов типа long, short или int. Алгоритм гарантирует генерацию идентификаторов, которые уникальны только в данной базе данных.
167
* seqhilo - использует алгоритм hi/lo для генерации идентификаторов типа long, short или int учитывая последовательность базы данных.
168
* uuid - использует для генерации идентификатора алгоритм 128-bit UUID. Идентификатор будет уникальным в пределах сети. UUID представляется строкой из 32 чисел.
169
* guid - использует сгенерированую БД строку GUID в MS SQL Server и MySQL.
170
* native - использует identity, sequence или hilo в завимисимости от типа БД, с которой работает приложение
171
* assigned - позволяет приложению устанавливать идентификатор объекту, до вызова метода save(). Используется по умолчанию, если тег <generator> не указан.
172
* select - получает первичный ключ, присвоенный триггером БД
173
* foreign - использует идентификатор другого, связанного с данным объекта.
174
* Используется в <one-to-one> ассоциации первичных ключей.
175
* sequence-identity - специализированный генератор идентификатора.
176
177 1 Александр Александров
h3. Какие ключевые интерфейсы использует Hibernate?
178
179 2 Александр Александров
Существует пять ключевых интерфейсов которые используются в каждом приложении связанном с Hibernate:
180
181
* Session interface;
182
* SessionFactory interface;
183
* Configuration interface;
184
* Transaction interface;
185
* Query and Criteria interfaces.
186
187 1 Александр Александров
h3. Назовите некоторые важные аннотации, используемые для отображения в Hibernate.
188
189 2 Александр Александров
Hibernate поддерживает как аннотации из JPA, так и свои собственные, которые находятся в пакете org.hibernate.annotations. Наиболее важные аннотации JPA и Hibernate:
190
191
* javax.persistence.Entity: используется для указания класса как entity bean.
192
* javax.persistence.Table: используется для определения имени таблицы из БД, которая будет отображаться на entity bean.
193
* javax.persistence.Access: определяет тип доступа, поле или свойство. Поле — является значением по умолчанию и если нужно, чтобы hibernate использовать методы getter/setter, то их необходимо задать для нужного свойства.
194
* javax.persistence.Id: определяет primary key в entity bean.
195
* javax.persistence.EmbeddedId: используется для определения составного ключа в бине.
196
* javax.persistence.Column: определяет имя колонки из таблицы в базе данных.
197
* javax.persistence.GeneratedValue: задает стратегию создания основных ключей. Используется в сочетании с javax.persistence.GenerationType enum.
198
* javax.persistence.OneToOne: задает связь один-к-одному между двумя сущностными бинами. Соответственно есть другие аннотации OneToMany, ManyToOne и ManyToMany.
199
* org.hibernate.annotations.Cascade: определяет каскадную связь между двумя entity бинами. Используется в связке с org.hibernate.annotations.CascadeType.
200
* javax.persistence.PrimaryKeyJoinColumn: определяет внешний ключ для свойства. Используется вместе с org.hibernate.annotations.GenericGenerator и org.hibernate.annotations.Parameter.
201
202 1 Александр Александров
h3. Какая роль интерфейса Session в Hibernate?
203
204 2 Александр Александров
Session - это основной интерфейс, который отвечает за связь с базой данных. Так же, он помогает создавать объекты запросов для получение персистентных объектов. (персистентный объект - объект который уже находится в базе данных; объект запроса - объект который получается когда мы получаем результат запроса в базу данных, именно с ним работает приложение). Обьект Session можно получить из SessionFactory :
205
206
<pre><code class="java">
207
Session session = sessionFactory.openSession();
208
</code></pre>
209
210
Роль интерфейса Session:
211
212
* является оберткой для jdbc подключения к базе данных;
213
* является фабрикой для транзакций (согласно официальной документации transaction - аllows the application to deÙne units of work, что , по сути, означает что транзакция определяет границы операций связанных с базой данных).
214
* является хранителем обязательного кэша первого уровня
215
216 1 Александр Александров
h3. Является ли Hibernate Session потокобезоспаным?
217
218 2 Александр Александров
Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.
219
220 1 Александр Александров
h3. Какая роль интерфейса SessionFactory в Hibernate?
221
222 2 Александр Александров
Именно из объекта SessionFactory мы получаем объекты типа Session. На все приложение существует только одна SessionFactory и она инициализируеться вместе со стартом приложения. SessionFactory кэширует мета-дату и SQL запросы которые часто используются приложением во время работы. Так же оно кэширует информацию которая была получена в одной из транзакций и может быть использована и в других транзакциях.
223
224
Объект SessionFactory можно получить следующим обращением:
225
226
<pre><code class="java">
227
SessionFactory = sessionFactory = configuration.buildSessionFactory();
228
</code></pre>
229
230 1 Александр Александров
h3. Является ли Hibernate SessionFactory потокобезоспансым?
231
232 2 Александр Александров
Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно.
233
234 1 Александр Александров
h3. В чем разница между openSession и getCurrentSession?
235
236 2 Александр Александров
Hibernate SessionFactory getCurrentSession() возвращает сессию, связанную с контекстом. Но для того, чтобы это работало, нам нужно настроить его в конфигурационном файле hibernate. Так как этот объект session связан с контекстом hibernate, то отпадает необходимость к его закрытию. Объект session закрывается вместе с закрытием SessionFactory.
237
238
<pre><code class="xml">
239
<property name="hibernate.current_session_context_class">thread</property>
240
</code></pre>
241
242
Метод Hibernate SessionFactory openSession() всегда создает новую сессию. Мы должны обязательно контролировать закрытие объекта сеанса по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект session для каждого запроса. Существует еще один метод openStatelessSession(), который возвращает session без поддержки состояния. Такой объект не реализует первый уровень кэширования и не взаимодействует с вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий. Такие объекты могут быть полезны при загрузке больших объемов данных без удержания большого кол-ва информации в кэше.
243
244 1 Александр Александров
h3. Какие типы коллекций представлены в Hibernate?
245
246 2 Александр Александров
Bag, Set, List, Map, Array.
247
248 1 Александр Александров
h3. Какие типы менеджмента транзакций поддерживаются в Hibernate?
249
250 2 Александр Александров
Hibernate взаимодействует с БД через JDBC-соединение. Таким образом он поддерживает управляемые и не управляемые транзакции.
251
252
Неуправляемые транзакции в web-контейнере:
253
254
{{dmsf_image(308)}}
255
256
Управляемые транзакции на сервере приложений, использующий JTA:
257
258
{{dmsf_image(309)}}
259
260 1 Александр Александров
h3. Что собой являет коллекция типа Bag и зачем она используется?
261
262 2 Александр Александров
Своей реализации тип коллекции Bag очень напоминает Set, разница состоит в том, что Bag может хранить повторяющиеся значения. Bag хранит непроиндексированный список элементов. Большинство таблиц в базе данных имеют индексы отображающие положение элемента данных один относительно другого, данные индексы имеют представление в таблице в виде отдельной колонки. При объектно-реляционном маппинге, значения колонки индексов мапится на индекс в Array, на индекс в List или на key в Map. Если вам надо получить коллекцию объектов не содержащих данные индексы, то вы можете воспользоваться коллекциями типа Bag или Set (коллекции содержат данные в неотсортированном виде, но могут быть отсортированы согласно запросу).
263
264 1 Александр Александров
h3. Какие типы кэша используются в Hibernate?
265
266 2 Александр Александров
Hibernate использует 2 типа кэша: кэш первого уровня и кэш второго уровня.
267
268
Кэш первого уровня ассоциирован с объектом сесии, в то время, как кэш второго уровня ассоциирован с объектом фабрики сессий. По-умолчанию Hibernate использует кэш первого уровня для каждой операции в транзакции. В первую очередь кэш используется чтобы уменьшить количество SQL-запросов. Например если объект модифицировался несколько раз в одной и той же транзакции, то Hibernate сгенерирует только один UPDATE.
269
270
Чтобы уменьшить трафик с БД, Hibernate использует кэш второго уровня, который является общим для всего приложения, а не только для данного конкретного пользователя. Таким образом если результат запроса находится в кэше, мы потенциально уменьшаем количество транзакций к БД.
271
272
EHCache - это быстрый и простой кэш. Он поддерживает read-only и read/write кэширование, а так же кэширование в память и на диск. Но не поддерживает кластеризацию.
273
OSCache - это другая opensource реализация кэша. Помимо всего, что поддерживает EHCache, эта реализация так же поддерживает кластеризацию через JavaGroups или JMS.
274
SwarmCache - это просто cluster-based решение, базирующееся на JavaGroups. Поддерживает read-only и нестрогое read/write кэширование. Этот тип кэширование полезен, когда количество операций чтения из БД превышает количество операций записи.
275
JBoss TreeCache - предоставляет полноценный кэш транзакции.
276
277 1 Александр Александров
h3. Какие существуют типы стратегий кэша?
278
279 2 Александр Александров
Read-only: эта стратегия используется когда данные вычитываются, но никогда не обновляется. Самая простая и производительная стратегия
280
Read/write: может быть использована, когда данные должны обновляться.
281
Нестрогий read/write: эта стратегия не гарантирует, что две транзакции не модифицируют одни и те же данные синхронно.
282
Transactional: полноценное кэширование транзакций. Доступно только в JTA окружении.
283
284 1 Александр Александров
h3. Что вы знаете о кэширование в Hibernate? Объясните понятие кэш первого уровня в Hibernate?
285 2 Александр Александров
286
Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных.
287
288
Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш. 
289
290 1 Александр Александров
Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны.
291
292
h3. Как настраивается кэш второго уровня в Hibernate?
293
294 3 Александр Александров
Чтобы указать кэш второго уровня нужно определить hibernate.cache.provider_class в hibernate.cfg.xml:
295
296
{{dmsf_image(310)}}
297
298
По-умолчанию используется EHCache.
299
300
Чтобы использвать кэш запросов нужно его включить установив свойство hibernate.cache.use_query_cache в true в hibernate.properties.
301
302 1 Александр Александров
h3. Какая разница в работе методов load(); и get();?
303
304 3 Александр Александров
Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого - get() и load().
305
306
* Метод load(); обычно используется когда в не уверен что запрашиваемый объект уже находится в базе данных. Если объект не найден, то метод кидает исключение Если объект найден — метод возвращает прокси объект, который является ссылкой на объект находящийся в базе данных (запрос в базу данных еще не был осуществлен, своего рода lazy изъятие), непосредственный запрос к базе данных когда мы непосредственно обращаемся к необходимому объекту через прокси объект.
307
* Метод get(); используется тогда, вы на 100 процентов не уверены есть ли запрашиваемый объект в базе данных. В случае обращение к несуществующему объекту, метод get(); вернет null. В случае нахождения объект, метод get(); вернет сам объект и запрос в базу данных будет произведен немедленно.
308
309 1 Александр Александров
h3. Каковы существуют различные состояния у entity bean?
310
311 3 Александр Александров
Transient: состояние, при котором объект никогда не был связан с какой-либо сессией и не является персистентностью. Этот объект находится во временном состоянии. Объект в этом состоянии может стать персистентным при вызове метода save(), persist() или saveOrUpdate(). Объект персистентности может перейти в transient состоянии после вызова метода delete().
312
313
Persistent: когда объект связан с уникальной сессией он находится в состоянии persistent (персистентности). Любой экземпляр, возвращаемый методами get() или load() находится в состоянии persistent.
314
315
Detached: если объект был персистентным, но сейчас не связан с какой-либо сессией, то он находится в отвязанном (detached) состоянии. Такой объект можно сделать персистентным используя методы update(), saveOrUpdate(), lock() или replicate().
316
317
Состояния transient или detached так же могут перейти в состояние persistent как новый объект персистентности после вызова метода merge().
318
319 1 Александр Александров
h3. Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean?
320
321 3 Александр Александров
Hibernate использует рефлексию для создания экземпляров Entity бинов при вызове методов get() или load(). Для этого используется метод Class.newInstance(), который требует наличия конструктора без параметров. Поэтому, в случае его отсутствия, вы получите ошибку HibernateException.
322
323 1 Александр Александров
h3. Как используется вызов метода Hibernate Session merge()?
324
325 3 Александр Александров
Hibernate merge() может быть использован для обновления существующих значений, однако этот метод создает копию из переданного объекта сущности и возвращает его. Возвращаемый объект является частью контекста персистентности и отслеживает любые изменения, а переданный объект не отслеживается.
326
327 1 Александр Александров
h3. В чем разница между Hibernate save(), saveOrUpdate() и persist()?
328
329 3 Александр Александров
Hibernate save() используется для сохранения сущности в базу данных. Проблема с использованием метода save() заключается в том, что он может быть вызван без транзакции. А следовательно если у нас имеется отображение нескольких объектов, то только первичный объект будет сохранен и мы получим несогласованные данные.
330
331
Также save() немедленно возвращает сгенерированный идентификатор. Hibernate persist() аналогичен save() с транзакцией. persist() не возвращает сгенерированный идентификатор сразу.
332
333
Hibernate saveOrUpdate() использует запрос для вставки или обновления, основываясь на предоставленных данных. Если данные уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate() можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save().
334
335 1 Александр Александров
h3. Что такое Lazy fetching(изъятие) в Hibernate?
336
337 3 Александр Александров
Тип изьятия Lazy, в Hibernate, связан с листовыми(дочерними) сущностями и определяют политику совместного изъятия, если идет запрос на изъятие сущности родителя.
338
339
Простой пример:
340
341
Есть сущность Дом. Он хранит информацию о своем номере, улице, количество квартир и информацию о семьях которые живут в квартирах, эти семьи формируют дочернюю сущность относительно сущности Дом. Когда мы запрашиваем информацию о Доме, нам может быть совершенно ненужным знать информацию семьях которые в нем проживают, тут нам на помощь приходит lazy(ленивое) изъятие(fetching) которая позволяет сконфигурировать сущность Дом, чтобы информацию о семьях подавалась только по востребованию, это значительно облегчает запрос и ускоряет работу приложения.
342
343 1 Александр Александров
h3. В чем разница между sorted collection и ordered collection? Какая из них лучше?
344
345 3 Александр Александров
При использовании алгоритмов сортировки из Collection API для сортировки коллекции, то он вызывает отсортированный список (sorted list). Для маленьких коллекций это не приводит к излишнему расходу ресурсов, но на больших коллекциях это может привести к потери производительности и ошибкам OutOfMemory. Так же entity бины должны реализовывать интерфейс Comparable или Comparator для работы с сортированными коллекциями.
346
347
При использовании фреймворка Hibernate для загрузки данных из базы данных мы можем применить Criteria API и команду order by для получения отсортированного списка (ordered list). Ordered list является лучшим выбором к sorted list, т.к. он использует сортировку на уровне базы данных. Она быстрее и не может привести к утечке памяти.
348
349 1 Александр Александров
h3. Как реализованы Join’ы Hibernate?
350
351 3 Александр Александров
Существует несколько способов реализовать связи в Hibernate.
352 1 Александр Александров
353 3 Александр Александров
* Использовать ассоциации, такие как one-to-one, one-to-many, many-to-many.
354
* Использовать в HQL запросе команду JOIN. Существует другая форма «join fetch«, позволяющая загружать данные немедленно (не lazy).
355
* Использовать чистый SQL запрос с командой join.
356
357
h3. Почему мы не должны делать Entity class как final?
358
359
Хибернейт использует прокси классы для ленивой загрузки данных (т.е. по необходимости, а не сразу). Это достигается с помощью расширения entity bean и, следовательно, если бы он был Ùnal, то это было бы невозможно. Ленивая загрузка данных во многих случаях повышает производительность, а следовательно важна.
360
361 1 Александр Александров
h3. Что вы знаете о HQL и каковы его преимущества?
362
363 3 Александр Александров
Hibernate Framework поставляется с мощным объектно-ориентированным языком запросов - Hibernate Query Language (HQL). Он очень похож на SQL, за исключением, что в нем используются объекты вместо имен таблиц, что делает язык ближе к
364
объектно-ориентированному программированию. HQL является регистронезависимым, кроме использования в запросах имен java переменных и классов, где он подчиняется правилам Java. Например, SelECt то же самое, что и select, но com.blogspot.jsehelper.MyClass отличен от com.blogspot.jsehelper.MyCLASS. Запросы HQL кэшируются (это как плюс так и минус).
365
366 1 Александр Александров
h3. Что такое Query Cache в Hibernate?
367
368 3 Александр Александров
Hibernate реализует область кэша для запросов resultset, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции требуется несколько дополнительных шагов в коде. Query Cache полезны только для часто выполняющихся запросов с повторяющимися параметрами. Для начала необходимо добавить эту запись в файле конфигурации Hibernate:
369
370
<pre><code class="xml">
371
<property name="hibernate.cache.use_query_cache">true</property>
372
</code></pre>
373
374
Уже внутри кода приложения для запроса применяется метод setCacheable(true), как показано ниже:
375
376
{{dmsf_image(311)}}
377
378 1 Александр Александров
h3. Можем ли мы выполнить SQL (sql native) запрос в Hibernate?
379
380 3 Александр Александров
С помощью использования SQLQuery можно выполнять чистый запрос SQL. В общем случае это не рекомендуется, т.к. вы потеряете все преимущества HQL (ассоциации, кэширование). Выполнить можно примерно так:
381 1 Александр Александров
382 3 Александр Александров
{{dmsf_image(312)}}
383
384
h3. НАЗОВИТЕ ПРЕИМУЩЕСТВА ПОДДЕРЖКИ НАТИВНОГО SQL В HIBERNATE.
385
386
Использование нативного SQL может быть необходимо при выполнении запросов к некоторым базам данных, которые могут не поддерживаться в Hibernate. Примером может служить некоторые специфичные запросы и «фишки» при работе с БД от Oracle.
387
388 1 Александр Александров
h3. Что такое Named SQL Query?
389
390 3 Александр Александров
Hibernate поддерживает именованный запрос, который мы можем задать в каком-либо центральном месте и потом использовать его в любом месте в коде. Именованные запросы поддерживают как HQL, так и Native SQL. Создать именованный запрос можно с помощью JPA аннотаций @NamedQuery, @NamedNativeQuery или в конфигурационном файле отображения (mapping Ùles).
391
392 1 Александр Александров
h3. Каковы преимущества Named SQL Query?
393
394 3 Александр Александров
* Именованный запрос Hibernate позволяет собрать множество запросов в одном месте, а затем вызывать их в любом классе.
395
* Синтаксис Named Query проверяется при создании session factory, что позволяет заметить ошибку на раннем этапе, а не при запущенном приложении и выполнении запроса.
396
* Named Query глобальные, т.е. заданные однажды, могут быть использованы в любом месте.
397
398
Однако одним из основных недостатков именованного запроса является то, что его очень трудно отлаживать (могут быть сложности с поиском места определения запроса).
399
400 1 Александр Александров
h3. Как добавить логирование log4j в Hibernate приложение?
401
402 3 Александр Александров
Добавить зависимость log4j в проект.
403
404
Создать log4j.xml или log4j.properties файл и добавить его в classpath. Для веб приложений используйте ServletContextListener, а для автономных приложений DOMConÙgurator или PropertyConfigurator для настройки логирования. Создайте экземпляр org.apache.log4j.Logger и используйте его согласно задачи.
405
406 1 Александр Александров
h3. Как логировать созданные Hibernate SQL запросы в лог-файлы?
407
408 3 Александр Александров
Для логирования запросов SQL добавьте в файл конфигурации Hibernate строчку:
409
410
<pre><code class="xml">
411
<property name="hibernate.show_sql">true</property>
412
</code></pre>
413
414 1 Александр Александров
h3. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)?
415
416 3 Александр Александров
Hibernate использует прокси объект для поддержки отложенной загрузки. Обычно при загрузке данных из таблицы Hibernate не загружает все отображенные (замаппинные) объекты. Как только вы ссылаетесь на дочерний объект или ищите объект с помощью геттера, если связанная сущность не находиться в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов ваших entity объектов.
417
418 1 Александр Александров
h3. Как управлять транзакциями с помощью Hibernate?
419
420 3 Александр Александров
Hibernate вообще не допускает большинство операций без использования транзакций. Поэтому после получения экземпляра session от SessionFactory необходимо выполнить beginTransaction() для начала транзакции. Метод вернет ссылку, которую мы можем использовать для подтверждения или отката транзакции.
421
422
В целом, управление транзакциями в фреймворке выполнено гораздо лучше, чем в JDBC, т.к. мы не должны полагаться на возникновение исключения для отката транзакции. Любое исключение автоматически вызовет rollback.
423
424 1 Александр Александров
h3. Что такое каскадные связи (обновления) в Hibernate?
425
426 3 Александр Александров
Если у нас имеются зависимости между сущностями (entities), то нам необходимо определить как различные операции будут влиять на другую сущность. Это реализуется с помощью каскадных связей (или обновлений). Вот пример кода с использованием аннотации @Cascade:
427
428
{{dmsf_image(313)}}
429
430
Есть некоторые различия между enum CascadeType в Hibernate и в JPA. Поэтому обращайте внимание какой пакет вы импортируете при использовании аннотации и константы типа.
431
432 1 Александр Александров
h3. Какие каскадные типы есть в Hibernate?
433
434 3 Александр Александров
Наиболее часто используемые CascadeType перечисления описаны ниже.
435
436
* None: без Cascading. Формально это не тип, но если мы не указали каскадной связи, то никакая операция для родителя не будет иметь эффекта для ребенка.
437
* ALL: Cascades save, delete, update, evict, lock, replicate, merge, persist. В общем — всё.
438
* SAVE_UPDATE: Cascades save и update. Доступно только для hibernate.
439
* DELETE: передает в Hibernate native DELETE действие. Только для hibernate.
440
* DETATCH, MERGE, PERSIST, REFRESH и REMOVE – для простых операций.
441
* LOCK: передает в Hibernate native LOCK действие.
442
* REPLICATE: передает в Hibernate native REPLICATE действие.
443
444 1 Александр Александров
h3. Что такое сесиия и фаблика сессий в Hibernate? Как настроить session factory в конфигурационном файле Spring?
445
446 3 Александр Александров
Hibernate сессия - это главный интерфейс взаимодействия Java-приложения и Hibernate. SessionFactory позволяет создавать сессии согласно конфигурации hibernate.cfg.xml. Например:
447
448
{{dmsf_image(314)}}
449
450
При вызове Configuration().configure() загружается файл hibernate.cfg.xml и происходит настройка среды Hibernate. После того, как конфигурация загружена, вы можете сделать дополнительную модификацию настроек уже на программном уровне.
451
452
Данные корректировки возможны до создания экземпляра фабрики сессий. Экземпляр SessionFactory как правило создается один раз и используется во всем приложении. Главная задача сессии - обеспечить механизмы создания, чтения и удаления для экземпляров примапленых к БД классов. Экземпляры могут находиться в трёх состояниях:
453
454
transient - никогда не сохранялись, не ассоциированы ни с одной сессией;
455
persistent - ассоциированы с уникальной сессией;
456
detached - ранее сохраненные, не ассоциированы с сессией.
457
458
Объект Hibernate Session представляет одну операцию с БД. Сессию открывает фабрика сессий. Сессия должна быть закрыта, когда все операции с БД совершены. 
459
460
Пример:
461
462
{{dmsf_image(315)}}
463
464 1 Александр Александров
h3. Как использовать JNDI DataSource сервера приложений с Hibernate Framework?
465
466 3 Александр Александров
В веб приложении лучше всего использовать контейнер сервлетов для управления пулом соединений. Поэтому лучше определить JNDI ресурс для DataSource и использовать его в веб приложении. Для этого в Hibernate нужно удалить все специфичные для базы данных свойства из и использовать указания свойства JNDI DataSource:
467
468
<pre><code class="xml">
469
<property name="hibernate.connection.datasource">java:comp/env/jdbc/MyLocalDB</property>
470
</code></pre>
471
472 1 Александр Александров
h3. Как интегрировать Hibernate и Spring?
473
474 3 Александр Александров
Лучше всего прочитать о настройках на сайтах фреймворков для текущей версии. Оба фреймворка поддерживают интеграцию из коробки и в общем настройка их взаимодействия не составляет труда. Общие шаги выглядят следующим образом.
475
476
* Добавить зависимости для hibernate-entitymanager, hibernate-core и spring-orm.
477
* Создать классы модели и передать реализации DAO операции над базой данных. Важно, что DAO классы используют SessionFactory, который внедряется в конфигурации бинов Spring.
478
* Настроить конфигурационный файл Spring (смотрите в офф. документации или из примера на этом сайте)
479
* Дополнительно появляется возможность использовать аннотацию @Transactional и перестать беспокоиться об управлением транзакцией Hibernate.
480
481 1 Александр Александров
h3. Какие паттерны применяются в Hibernate?
482
483 3 Александр Александров
* Domain Model Pattern - объектная модель предметной области, включающая в себя как поведение так и данные.
484
* Data Mapper - слой мапперов (Mappers), который передает данные между объектами и базой данных, сохраняя их независимыми друг от друга и себя.
485
* Proxy Pattern - применяется для ленивой загрузки.
486
* Factory pattern - используется в SessionFactory
487
488 1 Александр Александров
h3. Расскажите о Hibernate Validator Framework.
489
490 3 Александр Александров
Проверка данных является неотъемлемой частью любого приложения. Hibernate Validator обеспечивает эталонную реализацию двух спецификаций JSR-303 и JSR-349 применяемых в Java. Для настройки валидации в Hibernate необходимо сделать следующие шаги.
491
492
* Добавить hibernate validation зависимости в проект.
493
494
{{dmsf_image(316)}}
495
496
* Так же требуются зависимости из JSR 341, реализующие UniÙed Expression Language для обработки динамических выражений и сообщений о нарушении ограничений.
497
498
{{dmsf_image(317)}}
499
500
* Использовать необходимые аннотации в бинах.
501
502
{{dmsf_image(318)}}
503
504 1 Александр Александров
h3. Какие преимущества дает использование плагина Hibernate Tools Eclipse?
505 3 Александр Александров
506
Плагин Hibernate Tools упрощает настройку маппинга, конфигурационного файла. Упрощает работы с файлами свойств или xml тегами. Помогает минимизировать ошибки написания кода.
Go to top