Бауэр К., Кинг Г., Грегори Г. - Java Persistence API и Hibernate (2017)
Java Persistence – механизм, помогающий обеспечить сохранность данных после завершения программы, что является главной чертой современных приложений. Hibernate – наиболее популярный инструмент Java для работы с базами данных, предоставляющим автоматическое прозрачное объектно-реляционное отображение, что значительно упрощает работу с SQL-базами данных в приложениях Java. Данная книга описывает разработку приложения с использованием Hibernate, связывая воедино сотни отдельных примеров. Также вы найдете хорошо иллюстриро ванное обсуждение лучших методик проектирования баз данных и методов оптимизации. Издание предназначено разработчикам, знакомым с языком Java.
Предисловие к первому изданию ............................................................................. 16
Введение . .......................................................................................................................................... 18
Благодарности ............................................................................................................................. 19
Об этой книге ................................................................................................................................. 21
Об изображении на обложке .......................................................................................... 24
Часть I. Начинаем работать с ORM ........................................................................... 25
Глава 1. Основы объектно-реляционного отображения ..................... 26
1.1. Что такое долговременное хранение?.................................................................................... 27
1.1.1. Реляционные базы данных................................................................................................ 28
1.1.2. Разбираемся с SQL............................................................................................................... 29
1.1.3. Использование SQL в Java................................................................................................ 30
1.2. Несоответствие парадигм........................................................................................................... 32
1.2.1. Проблема детализации....................................................................................................... 33
1.2.2. Проблема подтипов.............................................................................................................. 35
1.2.3. Проблема идентичности..................................................................................................... 37
1.2.4. Проблемы, связанные с ассоциациями......................................................................... 38
1.2.5. Проблемы навигации по данным.................................................................................... 39
1.3. ORM и JPA....................................................................................................................................... 41
1.4. Резюме............................................................................................................................................... 43
Глава 2. Создаем проект .................................................................................................... 44
2.1. Представляем Hibernate............................................................................................................. 44
2.2. «HELLO WORLD» и JPA........................................................................................................... 45
2.2.1. Настройка единицы хранения.......................................................................................... 46
2.2.2. Хранимый класс.................................................................................................................... 47
2.2.3. Сохранение и загрузка сообщений................................................................................. 49
2.3. Оригинальная конфигурация Hibernate............................................................................... 51
2.4. Резюме............................................................................................................................................... 54
Глава 3. Модели предметной области и метаданные . ......................... 55
3.1. Учебное приложение CaveatEmptor....................................................................................... 56
3.1.1. Многоуровневая архитектура.......................................................................................... 56
3.1.2. Анализ предметной области............................................................................................. 58
3.1.3. Предметная модель приложения CaveatEmptor....................................................... 59Содержание ? 7
3.2. Реализация предметной модели.............................................................................................. 61
3.2.1. Предотвращение утечек функциональности.............................................................. 61
3.2.2. Прозрачность сохранения и его автоматизация........................................................ 62
3.2.3. Создание классов с возможностью сохранения......................................................... 64
3.2.4. Реализация ассоциаций в POJO.................................................................................... 67
3.3. Метаданные предметной модели............................................................................................. 72
3.3.1. Определение метаданных с помощью аннотаций..................................................... 73
3.3.2. Применение правил валидации компонентов............................................................ 75
3.3.3. Метаданные во внешних XML-файлах......................................................................... 78
3.3.4. Доступ к метаданным во время выполнения.............................................................. 82
3.4. Резюме............................................................................................................................................... 86
Часть II. Стратегии отображения ............................................................................... 87
Глава 4. Отображение хранимых классов . ....................................................... 88
4.1. Понятие сущностей и типов-значений.................................................................................. 88
4.1.1. Хорошо детализированные модели предметной области....................................... 89
4.1.2. Определение сущностей приложения........................................................................... 89
4.1.3. Разделение сущностей и типов-значений.................................................................... 91
4.2. Отображение сущностей с идентичностью.......................................................................... 93
4.2.1. Идентичность и равенство в Java.................................................................................... 93
4.2.2. Первый класс сущности и его отображение................................................................ 94
4.2.3. Выбор первичного ключа................................................................................................... 95
4.2.4. Настройка генераторов ключей....................................................................................... 97
4.2.5. Стратегии генерации идентификаторов....................................................................... 99
4.3. Способы отображений сущностей......................................................................................... 103
4.3.1. Управление именами......................................................................................................... 103
4.3.2. Динамическое формирование SQL.............................................................................. 106
4.3.3. Неизменяемые сущности................................................................................................. 107
4.3.4. Отображение сущности в подзапрос............................................................................ 108
4.4. Резюме............................................................................................................................................. 110
Глава 5. Отображение типов-значений . ............................................................ 111
5.1. Отображение полей основных типов................................................................................... 112
5.1.1. Переопределение настроек по умолчанию для свойств основных типов....... 112
5.1.2. Настройка доступа к свойствам..................................................................................... 114
5.1.3. Работа с вычисляемыми полями................................................................................... 116
5.1.4. Преобразование значений столбцов............................................................................ 117
5.1.5. Значения свойств, генерируемые по умолчанию.................................................... 118
5.1.6. Свойства для представления времени......................................................................... 119
5.1.7. Отображение перечислений........................................................................................... 120
5.2. Отображение встраиваемых компонентов.................................................................... 121
5.2.1. Схема базы данных............................................................................................................. 1218 ? Содержание
5.2.2. Встраиваемые классы........................................................................................................ 122
5.2.3. Переопределение встроенных атрибутов................................................................... 125
5.2.4. Отображение вложенных встраиваемых компонентов......................................... 126
5.3. Отображение типов Java и SQL с применением конвертеров..................................... 128
5.3.1. Встроенные типы................................................................................................................ 128
5.3.2. Создание собственных конвертеров JPA.................................................................... 135
5.3.3. Расширение Hibernate с помощью пользовательских типов.............................. 141
5.4. Резюме............................................................................................................................................. 148
Глава 6. Отображение наследования .................................................................. 150
6.1. Одна таблица для каждого конкретного класса и неявный полиморфизм............ 151
6.2. Одна таблица для каждого конкретного класса с объединениями............................ 153
6.3. Единая таблица для целой иерархии классов................................................................... 156
6.4. Одна таблица для каждого подкласса с использованием соединений..................... 159
6.5. Смешение стратегий отображения наследования........................................................... 163
6.6. Наследование и встраиваемые классы................................................................................ 165
6.7. Выбор стратегии.......................................................................................................................... 168
6.8. Полиморфные ассоциации....................................................................................................... 170
6.8.1. Полиморфная ассоциация многие к одному (many-to-one).................................. 170
6.8.2. Полиморфные коллекции................................................................................................ 173
6.9. Резюме............................................................................................................................................. 174
Глава 7. Отображение коллекций и связей
между сущностями . .............................................................................................................. 175
7.1. Множества, контейнеры, списки и словари с типами-значениями............................ 176
7.1.1. Схема базы данных.............................................................................................................. 176
7.1.2. Создание и отображение поля коллекции.................................................................. 176
7.1.3. Выбор интерфейса коллекции........................................................................................ 178
7.1.4. Отображение множества................................................................................................... 180
7.1.5. Отображение контейнера идентификаторов............................................................. 181
7.1.6. Отображение списка........................................................................................................... 182
7.1.7. Отображение словаря......................................................................................................... 184
7.1.8. Отсортированные и упорядоченные коллекции....................................................... 185
7.2. Коллекции компонентов........................................................................................................... 188
7.2.1. Равенство экземпляров компонентов........................................................................... 189
7.2.2. Множество компонентов................................................................................................... 191
7.2.3. Контейнер компонентов.................................................................................................... 193
7.2.4. Словарь с компонентами в качестве значений......................................................... 194
7.2.5. Компоненты в роли ключей словаря............................................................................ 195
7.2.6. Коллекции во встраиваемых компонентах................................................................. 197
7.3. Отображение связей между сущностями............................................................................ 198
7.3.1. Самая простая связь............................................................................................................ 199
7.3.2. Определение двунаправленной связи.......................................................................... 200Содержание ? 9
7.3.3. Каскадная передача состояния....................................................................................... 202
7.4. Резюме.............................................................................................................................................. 209
Глава 8. Продвинутые приемы отображения связей
между сущностями . .............................................................................................................. 211
8.1. Связи один к одному.................................................................................................................... 212
8.1.1. Общий первичный ключ................................................................................................... 212
8.1.2. Генератор внешнего первичного ключа........................................................................ 215
8.1.3. Соединение с помощью столбца внешнего ключа................................................... 218
8.1.4. Использование таблицы соединения............................................................................ 220
8.2. Связь один ко многим.................................................................................................................. 222
8.2.1. Применение контейнеров в связях один ко многим................................................. 223
8.2.2. Однонаправленное и двунаправленное отображения списка.............................. 224
8.2.3. Необязательная связь один ко многим с таблицей соединения............................ 227
8.2.4. Связь один ко многим во встраиваемых классах........................................................ 229
8.3. Тройные связи и связи многие ко многим............................................................................. 231
8.3.1. Однонаправленные и двунаправленные связи многие ко многим....................... 232
8.3.2. Связь многие ко многим с промежуточной сущностью........................................... 234
8.3.3. Тройные связи с компонентами...................................................................................... 239
8.4. Связи между сущностями с использованием словарей.................................................. 242
8.4.1. Связь один ко многим со свойством для ключа.......................................................... 242
8.4.2. Тройное отношение вида ключ/значение................................................................... 243
8.5. Резюме.............................................................................................................................................. 245
Глава 9. Сложные и унаследованные схемы ................................................ 246
9.1. Улучшаем схему базы данных.................................................................................................. 247
9.1.1. Добавление вспомогательных объектов базы данных............................................ 248
9.1.2. Ограничения SQL................................................................................................................ 251
9.1.3. Создание индексов.............................................................................................................. 258
9.2. Унаследованные первичные ключи...................................................................................... 259
9.2.1. Отображение естественных первичных ключей....................................................... 259
9.2.2. Отображение составных первичных ключей............................................................. 260
9.2.3. Внешние ключи внутри составных первичных ключей......................................... 262
9.2.4. Внешний ключ, ссылающийся на составной первичный ключ........................... 266
9.2.5. Внешние ключи, ссылающиеся на непервичные ключи........................................ 267
9.3. Отображение свойств во вторичные таблицы................................................................... 268
9.4. Резюме.............................................................................................................................................. 270
Часть III. Транзакционная обработка данных .............................................. 271
Глава 10. Управление данными . ............................................................................... 272
10.1. Жизненный цикл хранения................................................................................................... 273
10.1.1. Состояния экземпляров сущностей.......................................................................... 27310 ? Содержание
10.1.2. Контекст хранения........................................................................................................... 275
10.2. Интерфейс EntityManager..................................................................................................... 277
10.2.1. Каноническая форма единицы работы..................................................................... 277
10.2.2. Сохранение данных......................................................................................................... 279
10.2.3. Извлечение и модификация хранимых данных.................................................... 280
10.2.4. Получение ссылки на объект....................................................................................... 282
10.2.5. Переход данных во временное состояние................................................................ 283
10.2.6. Изменение данных в памяти........................................................................................ 285
10.2.7. Репликация данных......................................................................................................... 285
10.2.8. Кэширование в контексте хранения.......................................................................... 286
10.2.9. Выталкивание контекста хранения........................................................................... 288
10.3. Работа с отсоединенным состоянием........................................................................... 289
10.3.1. Идентичность отсоединенных экземпляров.......................................................... 289
10.3.2. Реализация метода проверки равенства................................................................... 292
10.3.3. Отсоединение экземпляров сущностей.................................................................... 295
10.3.4. Слияние экземпляров сущностей.............................................................................. 296
10.4. Резюме.......................................................................................................................................... 298
Глава 11. Транзакции и многопоточность ....................................................... 299
11.1. Основы транзакций.................................................................................................................. 300
11.1.1. Атрибуты ACID................................................................................................................ 300
11.1.2. Транзакции в базе данных и системные транзакции........................................... 300
11.1.3. Программные транзакции с JTA................................................................................. 301
11.1.4. Обработка исключений.................................................................................................. 303
11.1.5. Декларативное определение границ транзакции.................................................. 306
11.2. Управление параллельным доступом................................................................................. 307
11.2.1. Многопоточность на уровне базы данных............................................................... 307
11.2.2. Оптимистическое управление параллельным доступом................................... 313
11.2.3. Явные пессимистические блокировки..................................................................... 322
11.2.4. Как избежать взаимоблокировок............................................................................... 325
11.3. Доступ к данным вне транзакции......................................................................................... 327
11.3.1. Чтение данных в режиме автоматического подтверждения............................. 328
11.3.2. Создание очереди изменений...................................................................................... 330
11.4. Резюме........................................................................................................................................... 332
Глава 12. Планы извлечения, стратегии и профили ............................. 333
12.1. Отложенная и немедленная загрузка................................................................................ 334
12.1.1. Прокси-объекты................................................................................................................ 335
12.1.2. Отложенная загрузка хранимых коллекций........................................................... 339
12.1.3. Реализация отложенной загрузки путем перехвата вызовов........................... 342
12.1.4. Немедленная загрузка коллекций и ассоциаций.................................................. 345
12.2. Выбор стратегии извлечения................................................................................................ 347
12.2.1. Проблема n + 1 выражений SELECT........................................................................ 347Содержание ? 11
12.2.2. Проблема декартова произведения............................................................................ 348
12.2.3. Массовая предварительная выборка данных......................................................... 351
12.2.4. Предварительное извлечение коллекций с помощью подзапросов............... 354
12.2.5. Отложенное извлечение с несколькими выражениями SELECT................... 355
12.2.6. Динамическое немедленное извлечение.................................................................. 356
12.3. Профили извлечения............................................................................................................... 358
12.3.1. Определение профилей извлечения Hibernate...................................................... 359
12.3.2. Графы сущностей.............................................................................................................. 360
12.4. Резюме.......................................................................................................................................... 364
Глава 13. Фильтрация данных . ................................................................................... 365
13.1. Каскадная передача изменений состояния...................................................................... 366
13.1.1. Доступные способы каскадирования........................................................................ 367
13.1.2. Транзитивное отсоединение и слияние.................................................................... 367
13.1.3. Каскадное обновление.................................................................................................... 370
13.1.4. Каскадная репликация................................................................................................... 372
13.1.5. Глобальное каскадное сохранение.............................................................................. 373
13.2. Прием и обработка событий............................................................................................ 374
13.2.1. Приемники событий JPA и обратные вызовы........................................................ 374
13.2.2. Реализация перехватчиков Hibernate....................................................................... 378
13.2.3. Базовый механизм событий.......................................................................................... 383
13.3. Аудит и версионирование с помощью Hibernate Envers............................................. 384
13.3.1. Включение ведения журнала аудита......................................................................... 384
13.3.2. Ведение аудита.................................................................................................................. 386
13.3.3. Поиск версий...................................................................................................................... 387
13.3.4. Получение архивных данных....................................................................................... 388
13.4. Динамическая фильтрация данных.................................................................................... 391
13.4.1. Создание динамических фильтров............................................................................. 392
13.4.2. Применение фильтра....................................................................................................... 392
13.4.3. Активация фильтра.......................................................................................................... 393
13.4.4. Фильтрация коллекций.................................................................................................. 394
13.5. Резюме.......................................................................................................................................... 395
Часть IV. Создание запросов . ...................................................................................... 397
Глава 14. Создание и выполнение запросов . .............................................. 398
14.1. Создание запросов.................................................................................................................... 399
14.1.1. Интерфейсы запросов JPA............................................................................................ 399
14.1.2. Результаты типизированных запросов..................................................................... 402
14.1.3. Интерфейсы Hibernate для работы с запросами................................................... 402
14.2. Подготовка запросов................................................................................................................ 404
14.2.1. Защита от атак на основе внедрения SQL-кода..................................................... 404
14.2.2. Связывание именованных параметров..................................................................... 40512 ? Содержание
14.2.3. Связывание позиционных параметров..................................................................... 406
14.2.4. Постраничная выборка больших наборов с результатами................................. 407
14.3. Выполнение запросов.............................................................................................................. 409
14.3.1. Извлечение полного списка результатов................................................................. 409
14.3.2. Получение единичных результатов........................................................................... 409
14.3.3. Прокрутка с помощью курсоров базы данных....................................................... 411
14.3.4. Обход результатов с применением итератора........................................................ 412
14.4. Обращение к запросам по именам и их удаление из программного кода............. 413
14.4.1. Вызов именованных запросов...................................................................................... 414
14.4.2. Хранение запросов в метаданных XML................................................................... 414
14.4.3. Хранение запросов в аннотациях................................................................................ 416
14.4.4. Программное создание именованных запросов..................................................... 416
14.5. Подсказки для запросов......................................................................................................... 417
14.5.1. Установка предельного времени выполнения........................................................ 418
14.5.2. Установка режима выталкивания контекста хранения....................................... 419
14.5.3. Установка режима только для чтения....................................................................... 419
14.5.4. Определение количества одновременно извлекаемых записей....................... 420
14.5.5. Управление комментариями SQL............................................................................... 420
14.5.6. Подсказки для именованных запросов..................................................................... 421
14.6. Резюме.......................................................................................................................................... 422
Глава 15. Языки запросов ............................................................................................... 424
15.1. Выборка........................................................................................................................................ 425
15.1.1. Назначение псевдонимов и определение корневых источников
запроса............................................................................................................................................... 426
15.1.2. Полиморфные запросы................................................................................................... 427
15.2. Ограничения............................................................................................................................... 428
15.2.1. Выражения сравнения.................................................................................................... 430
15.2.2. Выражения с коллекциями........................................................................................... 434
15.2.3. Вызовы функций.............................................................................................................. 435
15.2.4. Упорядочение результатов запроса............................................................................ 438
15.3. Проекции..................................................................................................................................... 439
15.3.1. Проекция сущностей и скалярных значений......................................................... 439
15.3.2. Динамическое создание экземпляров....................................................................... 441
15.3.3. Извлечение уникальных результатов........................................................................ 443
15.3.4. Вызов функций в проекциях........................................................................................ 443
15.3.5. Агрегирующие функции................................................................................................ 446
15.3.6. Группировка данных........................................................................................................ 447
15.4. Соединения................................................................................................................................. 449
15.4.1. Соединения в SQL........................................................................................................... 449
15.4.2. Соединение таблиц в JPA.............................................................................................. 452
15.4.3. Неявные соединения по связи..................................................................................... 452
15.4.4. Явные соединения............................................................................................................ 454Содержание ? 13
15.4.5. Динамическое извлечение с помощью соединений............................................. 456
15.4.6. Тета-соединения................................................................................................................ 460
15.4.7. Сравнение идентификаторов....................................................................................... 461
15.5. Подзапросы................................................................................................................................. 463
15.5.1. Коррелированные и некореллированные подзапросы........................................ 463
15.5.2. Кванторы............................................................................................................................. 464
15.6. Резюме.......................................................................................................................................... 466
Глава 16. Дополнительные возможности запросов . ............................ 467
16.1. Преобразование результатов запросов.............................................................................. 467
16.1.1. Получение списка списков............................................................................................ 469
16.1.2. Получение списка словарей.......................................................................................... 469
16.1.3. Отображение атрибутов в свойства компонента JavaBean................................ 470
16.1.4. Создание преобразователя ResultTransformer....................................................... 471
16.2. Фильтрация коллекций.......................................................................................................... 472
16.3. Интерфейс запросов на основе критериев в Hibernate................................................ 475
16.3.1. Выборка и упорядочение............................................................................................... 475
16.3.2. Ограничения...................................................................................................................... 476
16.3.3. Проекция и агрегирование............................................................................................ 478
16.3.4. Соединения......................................................................................................................... 479
16.3.5. Подзапросы......................................................................................................................... 481
16.3.6. Запросы по образцу......................................................................................................... 482
16.4. Резюме.......................................................................................................................................... 484
Глава 17. Настройка SQL-запросов ....................................................................... 485
17.1. Назад к JDBC............................................................................................................................. 486
17.2. Отображение результатов SQL-запросов......................................................................... 488
17.2.1. Проекции в SQL-запросах............................................................................................. 489
17.2.2. Отображение в классы сущностей............................................................................. 490
17.2.3. Настройка отображения запросов.............................................................................. 492
17.2.4. Размещение обычных запросов в отдельных файлах.......................................... 504
17.3. Настройка операций CRUD.................................................................................................. 509
17.3.1. Подключение собственных загрузчиков.................................................................. 509
17.3.2. Настройка операций создания, изменения, удаления......................................... 510
17.3.3. Настройка операций над коллекциями.................................................................... 512
17.3.4. Немедленное извлечение в собственном загрузчике........................................... 514
17.4. Вызов хранимых процедур.................................................................................................... 517
17.4.1. Возврат результата запроса........................................................................................... 518
17.4.2. Возврат нескольких результатов и количества изменений............................... 519
17.4.3. Передача входных и выходных аргументов............................................................ 521
17.4.4. Возвращение курсора...................................................................................................... 524
17.5. Применение хранимых процедур для операций CRUD............................................. 526
17.5.1. Загрузчик, вызывающий процедуру.......................................................................... 52614 ? Содержание
17.5.2. Использование процедур в операциях CUD.......................................................... 527
17.6. Резюме.......................................................................................................................................... 529
Часть V. Создание приложений ................................................................................. 531
Глава 18. Проектирование клиент-серверных приложений ......... 532
18.1. Разработка уровня хранения................................................................................................. 533
18.1.1. Обобщенный шаблон «объект доступа к данным».................................................... 535
18.1.2. Реализация обобщенных интерфейсов..................................................................... 537
18.1.3. Реализация интерфейсов DAO.................................................................................... 539
18.1.4. Тестирование уровня хранения................................................................................... 541
18.2. Создание сервера без состояния.......................................................................................... 543
18.2.1. Редактирование информации о товаре..................................................................... 543
18.2.2. Размещение ставки.......................................................................................................... 546
18.2.3. Анализ приложения без состояния............................................................................ 550
18.3. Разработка сервера с сохранением состояния................................................................ 552
18.3.1. Редактирование информации о товаре..................................................................... 553
18.3.2. Анализ приложений с сохранением состояния..................................................... 558
18.4. Резюме.......................................................................................................................................... 561
Глава 19. Создание веб-приложений .................................................................. 562
19.1. Интеграция JPA и CDI............................................................................................................ 563
19.1.1. Создание экземпляра EntityManager........................................................................ 563
19.1.2. Присоединение экземпляра EntityManager к транзакциям.............................. 565
19.1.3. Внедрение экземпляра EntityManager...................................................................... 565
19.2. Сортировка и постраничная выборка данных................................................................ 567
19.2.1. Реализация постраничной выборки с помощью смещения или поиска....... 567
19.2.2. Реализация постраничной выборки в уровне хранения..................................... 570
19.2.3. Постраничная выборка................................................................................................... 576
19.3. Создание JSF-приложений.................................................................................................... 577
19.3.1. Службы с областью видимости запроса................................................................... 578
19.3.2. Службы с областью видимости диалога................................................................... 581
19.4. Сериализация данных предметной модели..................................................................... 590
19.4.1. Создание JAX-RS-службы............................................................................................. 591
19.4.2. Применение JAXB-отображений................................................................................ 592
19.4.3. Сериализация прокси-объектов Hibernate.............................................................. 595
19.5. Резюме.......................................................................................................................................... 598
Глава 20. Масштабирование Hibernate . ............................................................ 599
20.1. Массовые и пакетные операции обработки данных..................................................... 600
20.1.1. Массовые операции в запросах на основе критериев и JPQL.......................... 600
20.1.2. Массовые операции в SQL............................................................................................ 605
20.1.3. Пакетная обработка данных......................................................................................... 606Содержание ? 15
20.1.4. Интерфейс StatelessSession . ........................................................................................ 610
20.2. Кэширование данных.............................................................................................................. 612
20.2.1. Архтектура общего кэша в Hibernate........................................................................ 613
20.2.2. Настройка общего кэша................................................................................................. 618
20.2.3. Кэширование коллекций и сущностей..................................................................... 619
20.2.4. Проверка работы разделяемого кэша........................................................................ 623
20.2.5. Установка режимов кэширования.............................................................................. 625
20.2.6. Управление разделяемым кэшем................................................................................ 627
20.2.7. Кэш результатов запросов............................................................................................. 627
20.3. Резюме.......................................................................................................................................... 630
Библиография ............................................................................................................................ 631
Введение . .......................................................................................................................................... 18
Благодарности ............................................................................................................................. 19
Об этой книге ................................................................................................................................. 21
Об изображении на обложке .......................................................................................... 24
Часть I. Начинаем работать с ORM ........................................................................... 25
Глава 1. Основы объектно-реляционного отображения ..................... 26
1.1. Что такое долговременное хранение?.................................................................................... 27
1.1.1. Реляционные базы данных................................................................................................ 28
1.1.2. Разбираемся с SQL............................................................................................................... 29
1.1.3. Использование SQL в Java................................................................................................ 30
1.2. Несоответствие парадигм........................................................................................................... 32
1.2.1. Проблема детализации....................................................................................................... 33
1.2.2. Проблема подтипов.............................................................................................................. 35
1.2.3. Проблема идентичности..................................................................................................... 37
1.2.4. Проблемы, связанные с ассоциациями......................................................................... 38
1.2.5. Проблемы навигации по данным.................................................................................... 39
1.3. ORM и JPA....................................................................................................................................... 41
1.4. Резюме............................................................................................................................................... 43
Глава 2. Создаем проект .................................................................................................... 44
2.1. Представляем Hibernate............................................................................................................. 44
2.2. «HELLO WORLD» и JPA........................................................................................................... 45
2.2.1. Настройка единицы хранения.......................................................................................... 46
2.2.2. Хранимый класс.................................................................................................................... 47
2.2.3. Сохранение и загрузка сообщений................................................................................. 49
2.3. Оригинальная конфигурация Hibernate............................................................................... 51
2.4. Резюме............................................................................................................................................... 54
Глава 3. Модели предметной области и метаданные . ......................... 55
3.1. Учебное приложение CaveatEmptor....................................................................................... 56
3.1.1. Многоуровневая архитектура.......................................................................................... 56
3.1.2. Анализ предметной области............................................................................................. 58
3.1.3. Предметная модель приложения CaveatEmptor....................................................... 59Содержание ? 7
3.2. Реализация предметной модели.............................................................................................. 61
3.2.1. Предотвращение утечек функциональности.............................................................. 61
3.2.2. Прозрачность сохранения и его автоматизация........................................................ 62
3.2.3. Создание классов с возможностью сохранения......................................................... 64
3.2.4. Реализация ассоциаций в POJO.................................................................................... 67
3.3. Метаданные предметной модели............................................................................................. 72
3.3.1. Определение метаданных с помощью аннотаций..................................................... 73
3.3.2. Применение правил валидации компонентов............................................................ 75
3.3.3. Метаданные во внешних XML-файлах......................................................................... 78
3.3.4. Доступ к метаданным во время выполнения.............................................................. 82
3.4. Резюме............................................................................................................................................... 86
Часть II. Стратегии отображения ............................................................................... 87
Глава 4. Отображение хранимых классов . ....................................................... 88
4.1. Понятие сущностей и типов-значений.................................................................................. 88
4.1.1. Хорошо детализированные модели предметной области....................................... 89
4.1.2. Определение сущностей приложения........................................................................... 89
4.1.3. Разделение сущностей и типов-значений.................................................................... 91
4.2. Отображение сущностей с идентичностью.......................................................................... 93
4.2.1. Идентичность и равенство в Java.................................................................................... 93
4.2.2. Первый класс сущности и его отображение................................................................ 94
4.2.3. Выбор первичного ключа................................................................................................... 95
4.2.4. Настройка генераторов ключей....................................................................................... 97
4.2.5. Стратегии генерации идентификаторов....................................................................... 99
4.3. Способы отображений сущностей......................................................................................... 103
4.3.1. Управление именами......................................................................................................... 103
4.3.2. Динамическое формирование SQL.............................................................................. 106
4.3.3. Неизменяемые сущности................................................................................................. 107
4.3.4. Отображение сущности в подзапрос............................................................................ 108
4.4. Резюме............................................................................................................................................. 110
Глава 5. Отображение типов-значений . ............................................................ 111
5.1. Отображение полей основных типов................................................................................... 112
5.1.1. Переопределение настроек по умолчанию для свойств основных типов....... 112
5.1.2. Настройка доступа к свойствам..................................................................................... 114
5.1.3. Работа с вычисляемыми полями................................................................................... 116
5.1.4. Преобразование значений столбцов............................................................................ 117
5.1.5. Значения свойств, генерируемые по умолчанию.................................................... 118
5.1.6. Свойства для представления времени......................................................................... 119
5.1.7. Отображение перечислений........................................................................................... 120
5.2. Отображение встраиваемых компонентов.................................................................... 121
5.2.1. Схема базы данных............................................................................................................. 1218 ? Содержание
5.2.2. Встраиваемые классы........................................................................................................ 122
5.2.3. Переопределение встроенных атрибутов................................................................... 125
5.2.4. Отображение вложенных встраиваемых компонентов......................................... 126
5.3. Отображение типов Java и SQL с применением конвертеров..................................... 128
5.3.1. Встроенные типы................................................................................................................ 128
5.3.2. Создание собственных конвертеров JPA.................................................................... 135
5.3.3. Расширение Hibernate с помощью пользовательских типов.............................. 141
5.4. Резюме............................................................................................................................................. 148
Глава 6. Отображение наследования .................................................................. 150
6.1. Одна таблица для каждого конкретного класса и неявный полиморфизм............ 151
6.2. Одна таблица для каждого конкретного класса с объединениями............................ 153
6.3. Единая таблица для целой иерархии классов................................................................... 156
6.4. Одна таблица для каждого подкласса с использованием соединений..................... 159
6.5. Смешение стратегий отображения наследования........................................................... 163
6.6. Наследование и встраиваемые классы................................................................................ 165
6.7. Выбор стратегии.......................................................................................................................... 168
6.8. Полиморфные ассоциации....................................................................................................... 170
6.8.1. Полиморфная ассоциация многие к одному (many-to-one).................................. 170
6.8.2. Полиморфные коллекции................................................................................................ 173
6.9. Резюме............................................................................................................................................. 174
Глава 7. Отображение коллекций и связей
между сущностями . .............................................................................................................. 175
7.1. Множества, контейнеры, списки и словари с типами-значениями............................ 176
7.1.1. Схема базы данных.............................................................................................................. 176
7.1.2. Создание и отображение поля коллекции.................................................................. 176
7.1.3. Выбор интерфейса коллекции........................................................................................ 178
7.1.4. Отображение множества................................................................................................... 180
7.1.5. Отображение контейнера идентификаторов............................................................. 181
7.1.6. Отображение списка........................................................................................................... 182
7.1.7. Отображение словаря......................................................................................................... 184
7.1.8. Отсортированные и упорядоченные коллекции....................................................... 185
7.2. Коллекции компонентов........................................................................................................... 188
7.2.1. Равенство экземпляров компонентов........................................................................... 189
7.2.2. Множество компонентов................................................................................................... 191
7.2.3. Контейнер компонентов.................................................................................................... 193
7.2.4. Словарь с компонентами в качестве значений......................................................... 194
7.2.5. Компоненты в роли ключей словаря............................................................................ 195
7.2.6. Коллекции во встраиваемых компонентах................................................................. 197
7.3. Отображение связей между сущностями............................................................................ 198
7.3.1. Самая простая связь............................................................................................................ 199
7.3.2. Определение двунаправленной связи.......................................................................... 200Содержание ? 9
7.3.3. Каскадная передача состояния....................................................................................... 202
7.4. Резюме.............................................................................................................................................. 209
Глава 8. Продвинутые приемы отображения связей
между сущностями . .............................................................................................................. 211
8.1. Связи один к одному.................................................................................................................... 212
8.1.1. Общий первичный ключ................................................................................................... 212
8.1.2. Генератор внешнего первичного ключа........................................................................ 215
8.1.3. Соединение с помощью столбца внешнего ключа................................................... 218
8.1.4. Использование таблицы соединения............................................................................ 220
8.2. Связь один ко многим.................................................................................................................. 222
8.2.1. Применение контейнеров в связях один ко многим................................................. 223
8.2.2. Однонаправленное и двунаправленное отображения списка.............................. 224
8.2.3. Необязательная связь один ко многим с таблицей соединения............................ 227
8.2.4. Связь один ко многим во встраиваемых классах........................................................ 229
8.3. Тройные связи и связи многие ко многим............................................................................. 231
8.3.1. Однонаправленные и двунаправленные связи многие ко многим....................... 232
8.3.2. Связь многие ко многим с промежуточной сущностью........................................... 234
8.3.3. Тройные связи с компонентами...................................................................................... 239
8.4. Связи между сущностями с использованием словарей.................................................. 242
8.4.1. Связь один ко многим со свойством для ключа.......................................................... 242
8.4.2. Тройное отношение вида ключ/значение................................................................... 243
8.5. Резюме.............................................................................................................................................. 245
Глава 9. Сложные и унаследованные схемы ................................................ 246
9.1. Улучшаем схему базы данных.................................................................................................. 247
9.1.1. Добавление вспомогательных объектов базы данных............................................ 248
9.1.2. Ограничения SQL................................................................................................................ 251
9.1.3. Создание индексов.............................................................................................................. 258
9.2. Унаследованные первичные ключи...................................................................................... 259
9.2.1. Отображение естественных первичных ключей....................................................... 259
9.2.2. Отображение составных первичных ключей............................................................. 260
9.2.3. Внешние ключи внутри составных первичных ключей......................................... 262
9.2.4. Внешний ключ, ссылающийся на составной первичный ключ........................... 266
9.2.5. Внешние ключи, ссылающиеся на непервичные ключи........................................ 267
9.3. Отображение свойств во вторичные таблицы................................................................... 268
9.4. Резюме.............................................................................................................................................. 270
Часть III. Транзакционная обработка данных .............................................. 271
Глава 10. Управление данными . ............................................................................... 272
10.1. Жизненный цикл хранения................................................................................................... 273
10.1.1. Состояния экземпляров сущностей.......................................................................... 27310 ? Содержание
10.1.2. Контекст хранения........................................................................................................... 275
10.2. Интерфейс EntityManager..................................................................................................... 277
10.2.1. Каноническая форма единицы работы..................................................................... 277
10.2.2. Сохранение данных......................................................................................................... 279
10.2.3. Извлечение и модификация хранимых данных.................................................... 280
10.2.4. Получение ссылки на объект....................................................................................... 282
10.2.5. Переход данных во временное состояние................................................................ 283
10.2.6. Изменение данных в памяти........................................................................................ 285
10.2.7. Репликация данных......................................................................................................... 285
10.2.8. Кэширование в контексте хранения.......................................................................... 286
10.2.9. Выталкивание контекста хранения........................................................................... 288
10.3. Работа с отсоединенным состоянием........................................................................... 289
10.3.1. Идентичность отсоединенных экземпляров.......................................................... 289
10.3.2. Реализация метода проверки равенства................................................................... 292
10.3.3. Отсоединение экземпляров сущностей.................................................................... 295
10.3.4. Слияние экземпляров сущностей.............................................................................. 296
10.4. Резюме.......................................................................................................................................... 298
Глава 11. Транзакции и многопоточность ....................................................... 299
11.1. Основы транзакций.................................................................................................................. 300
11.1.1. Атрибуты ACID................................................................................................................ 300
11.1.2. Транзакции в базе данных и системные транзакции........................................... 300
11.1.3. Программные транзакции с JTA................................................................................. 301
11.1.4. Обработка исключений.................................................................................................. 303
11.1.5. Декларативное определение границ транзакции.................................................. 306
11.2. Управление параллельным доступом................................................................................. 307
11.2.1. Многопоточность на уровне базы данных............................................................... 307
11.2.2. Оптимистическое управление параллельным доступом................................... 313
11.2.3. Явные пессимистические блокировки..................................................................... 322
11.2.4. Как избежать взаимоблокировок............................................................................... 325
11.3. Доступ к данным вне транзакции......................................................................................... 327
11.3.1. Чтение данных в режиме автоматического подтверждения............................. 328
11.3.2. Создание очереди изменений...................................................................................... 330
11.4. Резюме........................................................................................................................................... 332
Глава 12. Планы извлечения, стратегии и профили ............................. 333
12.1. Отложенная и немедленная загрузка................................................................................ 334
12.1.1. Прокси-объекты................................................................................................................ 335
12.1.2. Отложенная загрузка хранимых коллекций........................................................... 339
12.1.3. Реализация отложенной загрузки путем перехвата вызовов........................... 342
12.1.4. Немедленная загрузка коллекций и ассоциаций.................................................. 345
12.2. Выбор стратегии извлечения................................................................................................ 347
12.2.1. Проблема n + 1 выражений SELECT........................................................................ 347Содержание ? 11
12.2.2. Проблема декартова произведения............................................................................ 348
12.2.3. Массовая предварительная выборка данных......................................................... 351
12.2.4. Предварительное извлечение коллекций с помощью подзапросов............... 354
12.2.5. Отложенное извлечение с несколькими выражениями SELECT................... 355
12.2.6. Динамическое немедленное извлечение.................................................................. 356
12.3. Профили извлечения............................................................................................................... 358
12.3.1. Определение профилей извлечения Hibernate...................................................... 359
12.3.2. Графы сущностей.............................................................................................................. 360
12.4. Резюме.......................................................................................................................................... 364
Глава 13. Фильтрация данных . ................................................................................... 365
13.1. Каскадная передача изменений состояния...................................................................... 366
13.1.1. Доступные способы каскадирования........................................................................ 367
13.1.2. Транзитивное отсоединение и слияние.................................................................... 367
13.1.3. Каскадное обновление.................................................................................................... 370
13.1.4. Каскадная репликация................................................................................................... 372
13.1.5. Глобальное каскадное сохранение.............................................................................. 373
13.2. Прием и обработка событий............................................................................................ 374
13.2.1. Приемники событий JPA и обратные вызовы........................................................ 374
13.2.2. Реализация перехватчиков Hibernate....................................................................... 378
13.2.3. Базовый механизм событий.......................................................................................... 383
13.3. Аудит и версионирование с помощью Hibernate Envers............................................. 384
13.3.1. Включение ведения журнала аудита......................................................................... 384
13.3.2. Ведение аудита.................................................................................................................. 386
13.3.3. Поиск версий...................................................................................................................... 387
13.3.4. Получение архивных данных....................................................................................... 388
13.4. Динамическая фильтрация данных.................................................................................... 391
13.4.1. Создание динамических фильтров............................................................................. 392
13.4.2. Применение фильтра....................................................................................................... 392
13.4.3. Активация фильтра.......................................................................................................... 393
13.4.4. Фильтрация коллекций.................................................................................................. 394
13.5. Резюме.......................................................................................................................................... 395
Часть IV. Создание запросов . ...................................................................................... 397
Глава 14. Создание и выполнение запросов . .............................................. 398
14.1. Создание запросов.................................................................................................................... 399
14.1.1. Интерфейсы запросов JPA............................................................................................ 399
14.1.2. Результаты типизированных запросов..................................................................... 402
14.1.3. Интерфейсы Hibernate для работы с запросами................................................... 402
14.2. Подготовка запросов................................................................................................................ 404
14.2.1. Защита от атак на основе внедрения SQL-кода..................................................... 404
14.2.2. Связывание именованных параметров..................................................................... 40512 ? Содержание
14.2.3. Связывание позиционных параметров..................................................................... 406
14.2.4. Постраничная выборка больших наборов с результатами................................. 407
14.3. Выполнение запросов.............................................................................................................. 409
14.3.1. Извлечение полного списка результатов................................................................. 409
14.3.2. Получение единичных результатов........................................................................... 409
14.3.3. Прокрутка с помощью курсоров базы данных....................................................... 411
14.3.4. Обход результатов с применением итератора........................................................ 412
14.4. Обращение к запросам по именам и их удаление из программного кода............. 413
14.4.1. Вызов именованных запросов...................................................................................... 414
14.4.2. Хранение запросов в метаданных XML................................................................... 414
14.4.3. Хранение запросов в аннотациях................................................................................ 416
14.4.4. Программное создание именованных запросов..................................................... 416
14.5. Подсказки для запросов......................................................................................................... 417
14.5.1. Установка предельного времени выполнения........................................................ 418
14.5.2. Установка режима выталкивания контекста хранения....................................... 419
14.5.3. Установка режима только для чтения....................................................................... 419
14.5.4. Определение количества одновременно извлекаемых записей....................... 420
14.5.5. Управление комментариями SQL............................................................................... 420
14.5.6. Подсказки для именованных запросов..................................................................... 421
14.6. Резюме.......................................................................................................................................... 422
Глава 15. Языки запросов ............................................................................................... 424
15.1. Выборка........................................................................................................................................ 425
15.1.1. Назначение псевдонимов и определение корневых источников
запроса............................................................................................................................................... 426
15.1.2. Полиморфные запросы................................................................................................... 427
15.2. Ограничения............................................................................................................................... 428
15.2.1. Выражения сравнения.................................................................................................... 430
15.2.2. Выражения с коллекциями........................................................................................... 434
15.2.3. Вызовы функций.............................................................................................................. 435
15.2.4. Упорядочение результатов запроса............................................................................ 438
15.3. Проекции..................................................................................................................................... 439
15.3.1. Проекция сущностей и скалярных значений......................................................... 439
15.3.2. Динамическое создание экземпляров....................................................................... 441
15.3.3. Извлечение уникальных результатов........................................................................ 443
15.3.4. Вызов функций в проекциях........................................................................................ 443
15.3.5. Агрегирующие функции................................................................................................ 446
15.3.6. Группировка данных........................................................................................................ 447
15.4. Соединения................................................................................................................................. 449
15.4.1. Соединения в SQL........................................................................................................... 449
15.4.2. Соединение таблиц в JPA.............................................................................................. 452
15.4.3. Неявные соединения по связи..................................................................................... 452
15.4.4. Явные соединения............................................................................................................ 454Содержание ? 13
15.4.5. Динамическое извлечение с помощью соединений............................................. 456
15.4.6. Тета-соединения................................................................................................................ 460
15.4.7. Сравнение идентификаторов....................................................................................... 461
15.5. Подзапросы................................................................................................................................. 463
15.5.1. Коррелированные и некореллированные подзапросы........................................ 463
15.5.2. Кванторы............................................................................................................................. 464
15.6. Резюме.......................................................................................................................................... 466
Глава 16. Дополнительные возможности запросов . ............................ 467
16.1. Преобразование результатов запросов.............................................................................. 467
16.1.1. Получение списка списков............................................................................................ 469
16.1.2. Получение списка словарей.......................................................................................... 469
16.1.3. Отображение атрибутов в свойства компонента JavaBean................................ 470
16.1.4. Создание преобразователя ResultTransformer....................................................... 471
16.2. Фильтрация коллекций.......................................................................................................... 472
16.3. Интерфейс запросов на основе критериев в Hibernate................................................ 475
16.3.1. Выборка и упорядочение............................................................................................... 475
16.3.2. Ограничения...................................................................................................................... 476
16.3.3. Проекция и агрегирование............................................................................................ 478
16.3.4. Соединения......................................................................................................................... 479
16.3.5. Подзапросы......................................................................................................................... 481
16.3.6. Запросы по образцу......................................................................................................... 482
16.4. Резюме.......................................................................................................................................... 484
Глава 17. Настройка SQL-запросов ....................................................................... 485
17.1. Назад к JDBC............................................................................................................................. 486
17.2. Отображение результатов SQL-запросов......................................................................... 488
17.2.1. Проекции в SQL-запросах............................................................................................. 489
17.2.2. Отображение в классы сущностей............................................................................. 490
17.2.3. Настройка отображения запросов.............................................................................. 492
17.2.4. Размещение обычных запросов в отдельных файлах.......................................... 504
17.3. Настройка операций CRUD.................................................................................................. 509
17.3.1. Подключение собственных загрузчиков.................................................................. 509
17.3.2. Настройка операций создания, изменения, удаления......................................... 510
17.3.3. Настройка операций над коллекциями.................................................................... 512
17.3.4. Немедленное извлечение в собственном загрузчике........................................... 514
17.4. Вызов хранимых процедур.................................................................................................... 517
17.4.1. Возврат результата запроса........................................................................................... 518
17.4.2. Возврат нескольких результатов и количества изменений............................... 519
17.4.3. Передача входных и выходных аргументов............................................................ 521
17.4.4. Возвращение курсора...................................................................................................... 524
17.5. Применение хранимых процедур для операций CRUD............................................. 526
17.5.1. Загрузчик, вызывающий процедуру.......................................................................... 52614 ? Содержание
17.5.2. Использование процедур в операциях CUD.......................................................... 527
17.6. Резюме.......................................................................................................................................... 529
Часть V. Создание приложений ................................................................................. 531
Глава 18. Проектирование клиент-серверных приложений ......... 532
18.1. Разработка уровня хранения................................................................................................. 533
18.1.1. Обобщенный шаблон «объект доступа к данным».................................................... 535
18.1.2. Реализация обобщенных интерфейсов..................................................................... 537
18.1.3. Реализация интерфейсов DAO.................................................................................... 539
18.1.4. Тестирование уровня хранения................................................................................... 541
18.2. Создание сервера без состояния.......................................................................................... 543
18.2.1. Редактирование информации о товаре..................................................................... 543
18.2.2. Размещение ставки.......................................................................................................... 546
18.2.3. Анализ приложения без состояния............................................................................ 550
18.3. Разработка сервера с сохранением состояния................................................................ 552
18.3.1. Редактирование информации о товаре..................................................................... 553
18.3.2. Анализ приложений с сохранением состояния..................................................... 558
18.4. Резюме.......................................................................................................................................... 561
Глава 19. Создание веб-приложений .................................................................. 562
19.1. Интеграция JPA и CDI............................................................................................................ 563
19.1.1. Создание экземпляра EntityManager........................................................................ 563
19.1.2. Присоединение экземпляра EntityManager к транзакциям.............................. 565
19.1.3. Внедрение экземпляра EntityManager...................................................................... 565
19.2. Сортировка и постраничная выборка данных................................................................ 567
19.2.1. Реализация постраничной выборки с помощью смещения или поиска....... 567
19.2.2. Реализация постраничной выборки в уровне хранения..................................... 570
19.2.3. Постраничная выборка................................................................................................... 576
19.3. Создание JSF-приложений.................................................................................................... 577
19.3.1. Службы с областью видимости запроса................................................................... 578
19.3.2. Службы с областью видимости диалога................................................................... 581
19.4. Сериализация данных предметной модели..................................................................... 590
19.4.1. Создание JAX-RS-службы............................................................................................. 591
19.4.2. Применение JAXB-отображений................................................................................ 592
19.4.3. Сериализация прокси-объектов Hibernate.............................................................. 595
19.5. Резюме.......................................................................................................................................... 598
Глава 20. Масштабирование Hibernate . ............................................................ 599
20.1. Массовые и пакетные операции обработки данных..................................................... 600
20.1.1. Массовые операции в запросах на основе критериев и JPQL.......................... 600
20.1.2. Массовые операции в SQL............................................................................................ 605
20.1.3. Пакетная обработка данных......................................................................................... 606Содержание ? 15
20.1.4. Интерфейс StatelessSession . ........................................................................................ 610
20.2. Кэширование данных.............................................................................................................. 612
20.2.1. Архтектура общего кэша в Hibernate........................................................................ 613
20.2.2. Настройка общего кэша................................................................................................. 618
20.2.3. Кэширование коллекций и сущностей..................................................................... 619
20.2.4. Проверка работы разделяемого кэша........................................................................ 623
20.2.5. Установка режимов кэширования.............................................................................. 625
20.2.6. Управление разделяемым кэшем................................................................................ 627
20.2.7. Кэш результатов запросов............................................................................................. 627
20.3. Резюме.......................................................................................................................................... 630
Библиография ............................................................................................................................ 631
Название: Java Persistence API и Hibernate
Автор: Бауэр К., Кинг Г., Грегори Г.
Год: 2017
Жанр: компьютерная, программирование
Издательство: ДМК Пресс
Язык: Русский
Формат: pdf
Качество: eBook
Страниц: 632
Размер: 11 MB
Пароль на архив: нет
Информация для восстановления: 5%
Скачать Бауэр К., Кинг Г., Грегори Г. - Java Persistence API и Hibernate (2017)
Наш сайт не предоставляет ссылки на скачивание |
Наш сайт не предоставляет ссылки на скачивание |
Наш сайт не предоставляет ссылки на скачивание |
Ключевые теги: компьютерная, программирование, книги, Java Persistence API и Hibernate
Другие новости по теме:
Панель управления
Реклама
Архив сайта
Октябрь 2023 (1)Сентябрь 2023 (15)
Ноябрь 2022 (9)
Октябрь 2022 (27)
Сентябрь 2022 (53)
Июль 2022 (70)
Июнь 2022 (100)
Май 2022 (198)
Апрель 2022 (63)
Март 2022 (5)
Февраль 2022 (82)
Январь 2022 (191)
Декабрь 2021 (101)
Ноябрь 2021 (13)
Октябрь 2021 (28)
Сентябрь 2021 (16)
Август 2021 (18)
Июль 2021 (24)
Июнь 2021 (5)
Апрель 2021 (12)
Март 2021 (11)
Февраль 2021 (1)
Январь 2021 (14)
Декабрь 2020 (11)
Ноябрь 2020 (68)
Октябрь 2020 (102)
Сентябрь 2020 (267)
Август 2020 (273)
Июль 2020 (204)
Июнь 2020 (278)
Май 2020 (420)
Апрель 2020 (302)
Март 2020 (85)
Февраль 2020 (78)
Январь 2020 (272)
Декабрь 2019 (143)
Ноябрь 2019 (209)
Октябрь 2019 (296)
Сентябрь 2019 (340)
Август 2019 (288)
Июль 2019 (338)
Июнь 2019 (298)
Май 2019 (125)
Апрель 2019 (461)
Март 2019 (471)
Февраль 2019 (343)
Январь 2019 (298)
Декабрь 2018 (279)
Ноябрь 2018 (170)
Октябрь 2018 (216)
Сентябрь 2018 (142)
Август 2018 (70)
Июль 2018 (110)
Июнь 2018 (141)
Май 2018 (215)
Апрель 2018 (178)
Март 2018 (203)
Февраль 2018 (132)
Январь 2018 (179)
Декабрь 2017 (317)
Ноябрь 2017 (320)
Октябрь 2017 (109)
Сентябрь 2017 (163)
Август 2017 (218)
Июль 2017 (295)
Июнь 2017 (231)
Май 2017 (219)
Апрель 2017 (174)
Март 2017 (414)
Февраль 2017 (593)
Январь 2017 (1128)
Декабрь 2016 (912)
Ноябрь 2016 (962)
Октябрь 2016 (913)
Сентябрь 2016 (651)
Август 2016 (392)
Июль 2016 (496)
Июнь 2016 (483)
Май 2016 (693)
Апрель 2016 (958)
Март 2016 (572)
Февраль 2016 (1031)
Январь 2016 (373)
Декабрь 2015 (198)
Ноябрь 2015 (91)
Октябрь 2015 (4)
Сентябрь 2015 (237)
Август 2015 (8)
Июль 2015 (799)
Июнь 2015 (1666)
Май 2015 (855)
Апрель 2015 (1843)
Март 2015 (1235)
Февраль 2015 (1)
Декабрь 2014 (6)
Ноябрь 2014 (11)
Октябрь 2014 (8)
Сентябрь 2014 (254)
Август 2014 (17350)
Июль 2014 (17980)
Июнь 2014 (19380)
Май 2014 (20276)
Апрель 2014 (18906)
Март 2014 (18541)
Февраль 2014 (17703)
Январь 2014 (22995)
Декабрь 2013 (16288)
Ноябрь 2013 (353)
Октябрь 2013 (473)
Сентябрь 2013 (408)
Август 2013 (243)
Июль 2013 (160)
Июнь 2013 (727)
Май 2013 (700)
Апрель 2013 (614)
Март 2013 (732)
Февраль 2013 (500)
Январь 2013 (584)
Декабрь 2012 (549)
Ноябрь 2012 (1153)
Октябрь 2012 (783)
Сентябрь 2012 (1153)
Август 2012 (624)
Июль 2012 (1114)
Июнь 2012 (1243)
Май 2012 (2940)
Апрель 2012 (3196)
Март 2012 (1355)
Январь 2012 (484)
Ноябрь 2011 (1691)
Октябрь 2011 (3640)
Сентябрь 2011 (2216)
Август 2011 (1769)
Июль 2011 (3102)
Июнь 2011 (1508)
Май 2011 (527)
Апрель 2011 (537)
Март 2011 (607)
Февраль 2011 (106)
Январь 2011 (2)
Октябрь 2010 (43)
Сентябрь 2010 (130)
Август 2010 (38)
Июль 2010 (44)
Март 2010 (63)
Февраль 2010 (192)
Январь 2010 (92)
Декабрь 2009 (110)
Май 2022 (198)
Апрель 2022 (63)
Март 2022 (5)
Февраль 2022 (82)
Январь 2022 (191)
Декабрь 2021 (101)
Ноябрь 2021 (13)
Октябрь 2021 (28)
Сентябрь 2021 (16)
Август 2021 (18)
Июль 2021 (24)
Июнь 2021 (5)
Апрель 2021 (12)
Март 2021 (11)
Февраль 2021 (1)
Январь 2021 (14)
Декабрь 2020 (11)
Ноябрь 2020 (68)
Октябрь 2020 (102)
Сентябрь 2020 (267)
Август 2020 (273)
Июль 2020 (204)
Июнь 2020 (278)
Май 2020 (420)
Апрель 2020 (302)
Март 2020 (85)
Февраль 2020 (78)
Январь 2020 (272)
Декабрь 2019 (143)
Ноябрь 2019 (209)
Октябрь 2019 (296)
Сентябрь 2019 (340)
Август 2019 (288)
Июль 2019 (338)
Июнь 2019 (298)
Май 2019 (125)
Апрель 2019 (461)
Март 2019 (471)
Февраль 2019 (343)
Январь 2019 (298)
Декабрь 2018 (279)
Ноябрь 2018 (170)
Октябрь 2018 (216)
Сентябрь 2018 (142)
Август 2018 (70)
Июль 2018 (110)
Июнь 2018 (141)
Май 2018 (215)
Апрель 2018 (178)
Март 2018 (203)
Февраль 2018 (132)
Январь 2018 (179)
Декабрь 2017 (317)
Ноябрь 2017 (320)
Октябрь 2017 (109)
Сентябрь 2017 (163)
Август 2017 (218)
Июль 2017 (295)
Июнь 2017 (231)
Май 2017 (219)
Апрель 2017 (174)
Март 2017 (414)
Февраль 2017 (593)
Январь 2017 (1128)
Декабрь 2016 (912)
Ноябрь 2016 (962)
Октябрь 2016 (913)
Сентябрь 2016 (651)
Август 2016 (392)
Июль 2016 (496)
Июнь 2016 (483)
Май 2016 (693)
Апрель 2016 (958)
Март 2016 (572)
Февраль 2016 (1031)
Январь 2016 (373)
Декабрь 2015 (198)
Ноябрь 2015 (91)
Октябрь 2015 (4)
Сентябрь 2015 (237)
Август 2015 (8)
Июль 2015 (799)
Июнь 2015 (1666)
Май 2015 (855)
Апрель 2015 (1843)
Март 2015 (1235)
Февраль 2015 (1)
Декабрь 2014 (6)
Ноябрь 2014 (11)
Октябрь 2014 (8)
Сентябрь 2014 (254)
Август 2014 (17350)
Июль 2014 (17980)
Июнь 2014 (19380)
Май 2014 (20276)
Апрель 2014 (18906)
Март 2014 (18541)
Февраль 2014 (17703)
Январь 2014 (22995)
Декабрь 2013 (16288)
Ноябрь 2013 (353)
Октябрь 2013 (473)
Сентябрь 2013 (408)
Август 2013 (243)
Июль 2013 (160)
Июнь 2013 (727)
Май 2013 (700)
Апрель 2013 (614)
Март 2013 (732)
Февраль 2013 (500)
Январь 2013 (584)
Декабрь 2012 (549)
Ноябрь 2012 (1153)
Октябрь 2012 (783)
Сентябрь 2012 (1153)
Август 2012 (624)
Июль 2012 (1114)
Июнь 2012 (1243)
Май 2012 (2940)
Апрель 2012 (3196)
Март 2012 (1355)
Январь 2012 (484)
Ноябрь 2011 (1691)
Октябрь 2011 (3640)
Сентябрь 2011 (2216)
Август 2011 (1769)
Июль 2011 (3102)
Июнь 2011 (1508)
Май 2011 (527)
Апрель 2011 (537)
Март 2011 (607)
Февраль 2011 (106)
Январь 2011 (2)
Октябрь 2010 (43)
Сентябрь 2010 (130)
Август 2010 (38)
Июль 2010 (44)
Март 2010 (63)
Февраль 2010 (192)
Январь 2010 (92)
Декабрь 2009 (110)