Hibernate для начинающих
Я сталкивался (да и не только я) с проблемой развертывания Hibernate и решил попробовать осветить данную тему. Hibernate — это популярный framework, цель которого связать ООП и реляционную базу данных. Работа с Hibernate сократит время разработки проекта в сравнении с обычным jdbc.
Потом в pom.xml вставляем. Нам понадобятся две зависимости: hibernate-core и mysql-connector, но если вы хотите больше функционала — вы должны подключить больше зависимостей.
Существуют стандартные рекомендации подключать зависимости по отдельности, но я так не делаю.
И щелкаем на Import Changes Enable Auto-Import, автоматически импортируя изменения.
Подключаемся к базе данных, которая развернута на локальном компьютере, выбираем поставщика баз данных MySQL.
Вводим имя базы данных, имя пользователя и пароль. Протестируйте соединение.
Выбираем проект и через framework support просим у хибернейта создать за нас Entity файлы и классы с Getter и Setter.
Выбираем Generate Persistence Mapping через кладку Persistence, выбираем jenerate Persistance Mapping, а в появившемся окне прописываем схему базы данных, выбираем prefix и
sufix к автоматически сгенерированным названиям. Будут сгенерированы названия xml файлов и классов с аннотациями:
Дописываем в hibernate.cfg username и password (звёзды поставил я, а так пишите обычным шрифтом).
Вот и все! Дальше через класс main запускаем проект.
Это моя первая статья. Рассчитываю на здравую критику.
Источник
Создаем простой maven проект с использованием Java EE + WildFly10 + JPA (Hibernate) + Postgresql + EJB + IntelliJ IDEA
В данной статья я расскажу, как сконфигурировать проект на JBoss с использование JPA. В подробности JPA, Hibernate, EJB лезть не буду, это отдельная тема. Просто покажу структуру проекта, как настроить datasource на WildFly и все это запустить в IntelliJ IDEA. Данный каркас, я думаю, будет полезен новичкам, работающим с JavaEE и JPA.
Установка WildFly10
Заходим на официальный сайт WildFly и скачиваем версию 10.1.0.Final. (возможно будет работать и другая, но в данном проекте я использовал ее).
Распаковываем архив в любую директорию на вашем компьютере.
Далее создадим нового пользователя. Для этого запускаем bin/add-user.bat. Там все достаточно просто. Следуем инструкциям и запоминаем введенный username и password.
Создание datasource
Следующим шагом будет создание datasource на сервере. Самым простым способом будет использование консоли администратора, предоставляемой WildFly.
Для того чтобы в нее зайти, сначала нужно запустить сервер /bin/standalone.bat и перейти по адресу 127.0.0.1:9990. Используем имя пользователя и пароль, которые только что создали.
Идем в раздел Deployments->Add->Upload a new deployment.
Теперь скачиваем jdbc драйвер с официального сайте postgresql. Я скачал postgresql-42.2.4.jar. Его добавляем в deployments. Имя можно дать любое.
Выбираем Postgresql Datasource и наш скачанный драйвер. Задаем url нашей базы, логин и пароль. (не путать с логином и паролем от сервера). Если все сделали правильно, то должен появиться ваш новый datasource в списке. Во вкладке View вы можете проверить соединение с базой, если нажмете Test Connection.
Создаем проект в IntelliJ IDEA
Здесь все стандартно. Думаю лишних комментариев не требуется. Создаем maven проект. В packaging ставим war. И добавляем необходимые зависимости.
Собственно вот мой pom.xml
Структура проекта
Обратите внимание, что persitence.xml лежит в WEB-INF->classes->META-INF.
А вот и сам persistence.xml
В качестве jta-data-source используем jndi-name, которое указали при создании datasource.
Если забыли, можно посмотреть на 127.0.0.1:9990 в разделе Configuration->Subsystems->Datasources->Наш datasource->View->Attributes->строка JNDI.
Теперь давайте посмотрим на наши классы.
1. Простейший entity класс.
Подробности не расписываю. Это уже другая тема.
Аннотация @PersistenceContext инжектит наш persistence-unit и на его основе создает EntityManager.
Аннотация @Stateless указывает, что это ejb.
3. Простейший Servlet
Аннотация @EJB инжектит JavaBean.
В методе doGet создается пользователь с именем «Ser» и вызывается метод saveUser из ejb.
Если таблицы userentity не было, то hibernate создаст сам таблицу и вставит туда нашего user.
Запуск проекта
Для настройки jboss в IDEA, заходим в Run->EditConfiguration, нажимаем «+» в левом верхнем углу и выбираем jboss-local.
В качестве ApplicationServer выбираем папку с нашим установленным WildFly. В качестве артифакта я выбрал ExternalArtifact (собранный maven hiberProject.war), убрал стандартный Build и добавил стандартные задачи maven (clean package install).
Теперь жмем старт и ждем когда загрузится сервер. Далее заходим на страницу localhost:8080/имяпроекта/test.
При загрузке страницы срабатывает метод doGet и наш user с именем «Ser» записывается в базу.
Всем спасибо. Надеюсь кому-то эта статья помогла.
Вот ссылка на GitHub с этим проектом.
Источник
Документация разработчика Hibernate – Глава I. Доступ к базе данных
Перевод статьи актуален для версии Hibernate 4.2.19.Final
Предисловие
Работа как с объектно-ориентированным ПО, так и с реляционными базами данных (далее БД, прим.перев.) может быть весьма обременительной и затратной с точки зрения потраченного времени. Затраты на разработку существенно выше из-за несовпадения парадигм представления данных в объектах и реляционных БД. Hibernate является решением т.н. объектно-реляционного проецирования для Java. Термин объектно-реляционного проецирования отноcится к технике проецирования (маппинга) данных из объектной модели представления к реляционной модели представления (и наоборот). См. en.wikipedia.org/wiki/Object-relational_mapping для более подробного ознакомления.
Hibernate не только заботится о проецировании Java-классов в таблицы БД (а также проецировании базовых типов Java к типам SQL), но и предоставляет механизмы формирования запросов и выборок данных. Он может существенно снизить время на разработку, которая в старом стиле велась путем ручной работы с данными с использованием SQL и JDBC. Главная цель архитектурного дизайна Hibernate – избавление разработчика от ежедневных задач работы с данными БД, путем избавления от нужд написания собственной логики работы с данными через SQL и JDBC. Однако, в отличие от других persistence-решений, Hibernate не скрывает от вас возможность использовать всю мощь SQL, и гарантирует, что ваши вложения в реляционные технологии и знания по-прежнему имеют силу.
Hibernate может быть не лучшим решением для приложений, хранящих всю свою бизнес-логику в хранимых процедурах, оно скорее подходит для объектно-ориентированных моделей и логики в среднем (бизнес) слое приложения, написанном на Java. Однако, Hibernate совершенно точно может помочь вам избавиться или инкапсулировать логику специфического SQL-кода, а также справиться с повседневными задачами трансляции результатов ваших запросов из табличного представления в граф объектов.
1. Доступ к базе данных
1.1. Подключение
Hibernate получает JDBC-соединения по мере необходимости через интерфейс org.hibernate.service.jdbc.connections.spi.ConnectionProvider. Приложения могут также предоставлять свои реализации интерфейса org.hibernate.service.jdbc.connections.spi.ConnectionProvider для определения кастомного подхода к предоставлению соединений Hibernate’у. (Из другого пула соединений, например)
1.1.1. Конфигурация
Вы можете сконфигурировать соединение к базе данных, используя property-файл, через XML-дескриптор развертывания или программно.
Пример 1.1. hibernate.properties для пула соединений c3p0
Пример 1.2. hibernate.cfg.xml для соединения к встраиваемой базе данных HSQL
1.1.1.1. Программная конфигурация
Экземпляр объекта org.hibernate.cfg.Configuration представляет полный набор типов маппингов на базу данных. Объект org.hibernate.cfg.Configuration создает иммутабельный объект org.hibernate.SessionFactory, и компилирует маппинги из различных XML-файлов. Вы можете указать файлы для маппинга напрямую, или Hibernate может найти их за вас.
Пример 1.3. Указание файлов для маппинга напрямую
Вы можете получить объект org.hibernate.cfg.Configuration, cоздав его и указав XML-документы для маппинга напрямую. Если файлы для маппинга находятся в classpath, используйте метод addResource().
Пример 1.4. Hibernate находит файлы за вас
Метод addClass() указывает Hibernate искать mapping-файлы через classpath, основываясь на имени класса, при этом избавляя вас от необходимости указывать имена файлов самому. В следующем примере, он ищет org/hibernate/auction/Item.hbm.xml и org/hibernate/auction/Bid.hbm.xml.
Пример 1.5. Указание свойств конфигурации
1.1.2. Получение JDBC-соединения
После того, как вы сконфигурируете Основные jdbc-свойства Hibernate, вы можете использовать метод openSession класса org.hibernate.SessionFactory для открытия сессий. Сессии откроют JDBC-cоединения по требованию, основываясь на предоставленной конфигурации.
Пример 1.6. Открытие сессии
1.2. Пулинг соединений (Connection pooling)
Внутренний алгоритм пулинга соединений в Hibernate довольно рудиментарен, и нужен, по большей части, для разработки и тестирования. Используйте сторонние (3 rd party) пулы для лучшей производительности и стабильности. Для использования 3 rd party пула, замените значение свойства hibernate.connection.pool_size на соответствующие специфике вашего выбранного пула. Это отключит использование встроенного пула Hibernate.
1.2.1. Пулинг с помощью c3p0
C3P0 – опенсорсный пул JDBC-соединений, распространяемый вместе с Hibernate в директории lib/. Hibernate будет использовать свой собственный org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider для пулинга соединений, при настройке свойств hibernate.c3p0.*
1.2.2. Пулинг с помощью Proxool
Proxool — другой опенсорсный пул, распространяемый вместе с Hibernate в директории lib/. Hibernate будет использовать свой собственный org.hibernate.service.jdbc.connections.internal.ProxoolConnectionProvider для пулинга соединений при соответствующей настройке hibernate.proxool.*. В отличие от c3p0, proxool требует некоторых дополнительных параметров настройки, которые описаны в документации, доступной на proxool.sourceforge.net/configure.html.
Таблица 1.1. Важные конфигурационные свойства для пула соединений Proxool
Свойство | Описание |
---|---|
hibernate.proxool.xml | Сконфигурируйте провайдер Proxool, используя указанный файл XML (.xml добавляется автоматически) |
hibernate.proxool.properties | Сконфигурируйте провайдер Proxool, используя указанный property-файл (.properties добавляется автоматически) |
hibernate.proxool.existing_pool | Конфигурировать ли провайдер Proxool из существующего пула |
hibernate.proxool.pool_alias | Псевдоним пула Proxool. Необходим. |
1.2.3. Получение соединений от сервера приложений, через JNDI
1.2.4. Прочее по конфигурации соединений
Вы можете передавать произвольные свойства соединения, добавляя перед ними hibernate.connection. К примеру, для указания свойства charSet используйте имя hibernate.connection.charSet.
Вы можете определить свою стратегию для получения JDBC-соединений, реализовав интерфейс org.hibernate.service.jdbc.connections.spi.ConnectionProvider, и указав вашу пользовательскую реализацию при помощи свойства hibernate.connection.provider_class
1.2.5. Необязательные свойства конфигурации
В дополнение к свойствам, перечисленным выше, Hibernate включает в себя множество других параметров. См. более подробный список на http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/.
1.3. Диалекты
Хотя SQL относительно стандартизирован, каждый поставщик СУБД использует свое подмножество поддерживаемых синтаксисов. У этого есть и другой термин, называемый диалектом. Hibernate поддерживает различные вариации диалектов через класс org.hibernate.dialect.Dialect и различные подклассы для каждого vendor-диалекта.
Таблица 1.2. Поддерживаемые диалекты СУБД
1.3.1. Указание диалекта для использования
Разработчик может вручную указать диалект для использования, указав в свойстве hibernate.dialect нужное имя подкласса org.hibernate.dialect.Dialect.
1.3.2. Разрешение диалекта
Заранее предположив, что org.hibernate.service.jdbc.connections.spi.ConnectionProvider был настроен, Hibernate попытается автоматически определить диалект, основываясь на java.sql.DatabaseMetaData получаемым из объекта java.sql.Connection, который в свою очередь достается из org.hibernate.service.jdbc.connections.spi.ConnectionProvider.
Эта функциональность предоставляется экземплярами org.hibernate.service.jdbc.dialect.spi.DialectResolver, зарегистрированными cамим фреймворком. Hibernate идет вместе со стандартным набором распознаваний. Если в вашем приложении требуются дополнительные возможности распознавания диалекта, вполне возможно зарегистрировать кастомную реализацию org.hibernate.service.jdbc.dialect.spi.DialectResolver, как показано ниже
Зарегистрированные реализации org.hibernate.service.jdbc.dialect.spi.DialectResolver добавляются во внутренний список resolverов, так что они имеют приоритет над уже ранее зарегистрированными resolver’ами, а также над стандартными.
1.4. Автоматическая генерация схемы при помощи SchemaExport
Перед тем, как Hibernate сможет сгенерировать вашу схему, вы должны кастомизировать ваши файлы маппинга.
1.4.1. Кастомизация файлов маппинга (Customizing the mapping files)
Hibernate предоставляет ряд элементов и атрибутов для ваших файлов маппинга. Они перечислены в Таблице 1.3, “Элементы и аттрибуты, предоставляемые для кастомизации файлов маппинга”, а логический порядок кастомизации представлен в Процедуре 1.1, “Кастомизация схемы”.
Таблица 1.3. Элементы и атрибуты, предоставляемые для кастомизации файлов маппинга
Имя | Тип значения | Описание |
---|---|---|
length | number | Длина колонки |
precision | number | Десятичная точность колонки |
scale | number | Десятичный масштаб колонки |
not-null | true или false | Может ли колонка содержать null-значения |
unique | true или false | Содержит ли колонка только уникальные значения |
index | string | Имя многоколоночного индекса |
unique-key | string | Имя многоколоночного ограничения на уникальность |
foreign-key | string | Имя ограничения внешнего ключа, генерируемое для ассоциаций. Это относится к <one-to-one>, <many-to-one>, <key>, и <many-to-many> элементам. inverse=«true» пропускаются SchemaExport. |
sql-type | string | Переопределяет тип колонки по-умолчанию. Это относится только к элементу <column>. |
default | string | Значение по-умолчанию для колонки |
check | string | SQL ограничения (SQL check constraint) либо на колонку, либо на таблицу |
Процедура 1.1. Кастомизация схемы
1. Установка длины, точности, и масштаба элементов маппинга.
Множество элементов маппинга определяют необязательные атрибуты, такие как длина, точность, и масштаб.
2. Установка not-null, UNIQUE, unique-key аттрибутов.
not-null и UNIQUE атрибуты генерируют ограничения на табличные колонки.
Атрибут unique-key группирует колонки в единое ограничение по уникальности. Атрибут переопределяет имя любого сгенерированного ограничения уникальности.
3. Установка index и foreign-key аттрибутов.
Атрибут index указывает имя индекса для его создания, используя спроецированную колонку или колонки. Вы можете сгруппировать несколько колонок по одному индексу, указав в каждой из них имя одного и того же индекса.
Атрибут внешнего ключа (foreign key) переопределяет имя любого сгенерированного ограничения внешнего ключа.
4. Установка дочерних <column>-элементов.
Множество элементов маппинга допускают использование дочерних <column> элементов. Это бывает полезно для маппинга типов, включающих в себя несколько колонок.
5. Установка атрибута default.
Атрибут default представляет собой значение по-умолчанию для колонки. Добавьте значение к спроецированному свойству перед сохранением нового экземпляра класса.
6. Установка атрибута sql-type.
Используйте атрибут sql-type для переопределения маппинга по-умолчанию для типов Java на типы SQL.
7. Установка атрибута check.
Используйте атрибут check для указания ограничения check.
8.Добавление <comment> элементов к вашей схеме.
Используйте элемент <comment> для указания комментариев для сгенерированной схемы.
1.4.2. Запуск инструмента SchemaExport
Инструмент SchemaExport записывает DDL-скрипт в стандартный поток вывода, исполняет DDL, или и то, и другое сразу.
Пример 1.7. Синтаксис SchemaExport
Таблица 1.4. Опции SchemaExport
Опция | Описание |
---|---|
—quiet | Не выводить скрипт в стандартный поток вывода |
—drop | Только удалять таблицы |
—create | Только создавать таблицы |
—text | Не экспортировать в БД |
—output=my_schema.ddl | Вывести скрипт в указанный файл |
—naming=eg.MyNamingStrategy | выбор NamingStrategy |
—namingdelegator=eg.MyNamingStrategyDelegator | выбор NamingStrategyDelegator |
—config=hibernate.cfg.xml | Чтение конфигурации Hibernate из файла XML |
—properties=hibernate.properties | Чтение свойств БД из указанного файла |
—format | Опрятное форматирование SQL |
—delimiter=; | Разделитель строк |
Пример 1.8. Встраивание SchemaExport в ваше приложение
Источник