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 тегами. Помогает минимизировать ошибки написания кода. |