Как подключить hibernate в idea
Создаем простой 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
Hibernate is an object-relational mapping framework that implements the Jakarta Persistence (JPA) specification.
IntelliJ IDEA provides the following:
Coding assistance specific to Hibernate.
Additions to the Persistence tool window for managing your Hibernate items, creating configuration files and persistent classes, navigating to related source code in the editor, opening diagrams and consoles, and more.
Entity-relationship (ER) diagrams that you can access from the Persistence tool window.
The Hibernate console for writing and running HQL queries, and analyzing the query results.
Create a new Java Enterprise project with Hibernate
In the wizard that opens, select Java Enterprise on the left.
Name the new project, select a build tool, a test framework, a language you want to use, and select the Web application project template.
Select the JDK that you want to use in your project.
If the JDK is installed on your computer, but not defined in the IDE, select Add JDK and specify the path to the JDK home directory.
On the next step of the wizard, select the Java EE version to be supported.
From the Dependencies list, select the Persistence (JPA) specification and Hibernate as the implementation.
For more information on how to create a Java Enterprise project, refer to Tutorial: Your first Java EE application.
IntelliJ IDEA creates the default project structure with the JPA facet and all the necessary libraries as external dependencies, such as javax.persistence for the JPA specification and org.hibernate for the Hibernate framework. If you specified an application server, IntelliJ IDEA will also create a run configuration to start the server, build and deploy the artifact.
Enable Hibernate support for an existing project
If you already have a Java Enterprise web application, you can add the Hibernate framework support.
Open the build file in the editor ( pom.xml or build.gradle depending on the build tool that you use in your project).
Add the following dependency, but make sure to change the version according to your project’s requirements:
Press Ctrl+Shift+O to import the changes.
For more information on how to work with build tools, refer to Maven or Gradle.
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 запускаем проект.
Это моя первая статья. Рассчитываю на здравую критику.
Hibernate — быстрый старт. Пример приложения Hibernate 5 Hello World
Java Hibernate — настройка, подключение к БД и создание простого приложения
Hibernate — один из самых популярных фреймворков для Java, выполняющая объектно-реляционное отображение (object-relational mapping — ORM). Этот фреймворк значительно сокращает время на реализацию задач отображения данных из таблиц в классы (POJO).
Используемые технологии:
1. Описание задачи
Необходимо создать пустой проект maven, подключить к нему фреймворк Hibernate. Затем подключиться к базе данных и записать в таблицу данные.
2. Структура проекта
3. Создание проекта
Создаем простой maven проект. Дальше подгрузим всё через pom.xml
4. pom.xml
5. Подключение фреймворка Hibernate в проект
В Idea нажимаем на проект, дальше Add Framework Support… и там выбираем Hibernate. Если у вас подгрузились зависимости, указанные выше, то будет доступен выбор из зависимостей maven. Так же можно установить галочку Import database schema о настройке схемы базы данных (БД) сразу после нажатия на ок. Я покажу эту настройку отдельно.
6. Создание файла настроек фрейморка hibernate.cfg.xml
Теперь нам нужно создать главный файл настроек Hibernate. Сделать это можно несколькими способами, вот один из них:
В настройках проекта (ctrl+alt+shift+s) выбираем хибернейт и дальше справа +. Указываем путь где будет храниться этот файл и жмем ок.
Листинг уже с настройками показан ниже. Обратите внимание, что после автоматической генерации сущностей свойства имя пользователя и пароль перезаписываются (или вообще удаляются). Так что здесь приведен уже конечный файл:
7. Подключение к базе данных MySQL
Этот пункт не будет рассмотрен в этой статье, т.к. он подробно рассматривается в отдельной заметке. Здесь можно посмотреть как создать базу данных MySQL и подключиться к ней в Idea.
8. Создание сущностей (POJO-классы) для колонок из базы данных
Выбираем какие настройки будут сгенерированы и жмем ок. Хоть на скриншоте и выбраны все галочки, но в итоге я удалил xml, которые были сгенерированы ( Generate Separate XML per Entity — для каждой сущности будут сгенерирован свой xml файл) и оставил только классы с аннотациями (наиболее удобный и распространенный вариант, хотя вариант с xml имеет свои достоинства)
9. Дополнительная информация по автоматическому созданию сущностей
Всё генерится замечательно, но есть некоторые особенности, которые обязательно необходимо учитывать. В этом примере сразу всплывают несколько вещей, которые я вам хотел показать в качестве примера. Итак.
В таблице при создании была создана колонка для контроля версий. Это тоже было пропущено при создании сущностей. Для исправления применяем аннотацию @Version :
Таким образом Вы увидели, что использование автоматического создания сущностей вещь крайне полезная, но понимать что там будет создано необходимо. На исправление уходит 1-2 минуты, а на прописывание каждого класса вручную намного больше.
В примере будет использована только одна сущность и ниже приведён её листинг:
10. Реализация org.hibernate.SessionFactory
11. Запуск приложения
Для запуска напишем простенький класс и запишем одну строку в таблицу:
После запуска проверим что получилось прямо из среды разработки. Как видим одна строчка записалась успешно:
Ссылки для скачивания
42 thoughts on “ Hibernate — быстрый старт. Пример приложения Hibernate 5 Hello World ”
Добрый день!
Спасибо за статью, заработало почти с первого раза!
Когда вставляю ваш код из class HibernateSessionFactory, то программа падает.
Как все таки удобно работать в Idea
Расскажите, пожалуйста, в чем ошибка и как решили. Это поможет другим читателям (или я подправлю код в исходниках, если дело в них).
P.S. скачал исходники в конце статьи и запустил как есть, всё отработало.
Очень интересно узнать как поправили HibernateSessionFactory. Бросает «Could not locate cfg.xml resource [hibernate.cfg.xml] «
Скорее всего у вас идет неправильная ссылка на местонахождение файла настроек. Часто бывает что cfg лежит в папке webapp/resources, а не src/resources. В любом случае посмотрите как обращаетесь к файлу и как прописаны настройки.
Exception in thread «main» org.hibernate.exception.SQLGrammarException: could not execute statement
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘javastudy.Contact’ doesn’t exist
делал по вашему примеру и когда сделал 8 пункт выскочила ошибка
Connection to hibernate.cfg.xml/Hibernate failed
Could not create connection to database server. Attempted reconnect 3 times. Giving up.
Из этого я понял что Hibernate не может соединится с базой данных. В чем может быть причина?
В итоге я сделал до конца приложение. В базу данные добавляются. Но вот что странное. На вкладке DataBase появилось два типа подключения к базе. Одно через MySQL и другое через Hibernate. Через MySQL все работает. Я могу посмотреть что элементы в таблицы добавляются. А вот когда пробую сделать тоже самое через Hibernate, то не получается. Вот скриншот.
На скрине просто две разных базы. Судя по описанию выше — приложение не видит настройки соединения или они не правильные. Вам нужно смотреть под вашу локальную базу что и как. А красное поле с ошибкой указывает на неправильную авторизацию.
Получил Exception на выходе (
Что может быть не так?
Exception in thread «main» java.lang.ExceptionInInitializerError: Initial SessionFactory failedorg.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at utils.HibernateSessionFactory.buildSessionFactory(HibernateSessionFactory.java:25)
at utils.HibernateSessionFactory. (HibernateSessionFactory.java:10)
at main.AppMain.main(AppMain.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Ошибка происходит в этом блоке:
Сергей, а как Вы решили проблему?
У меня такая же ошибка.
Отбой, с Вашим проектом все заработало.
Появился еще вопрос: почему в моих POJO классах после их сборки прописалось?
Честно говоря не вспомню дописывал это специально или это было сгенерировано. В любом случае, думаю, узнать что это за два пункта у вас не составит труда:)
Подскажите, в чём может быть проблема: нажимаю на проект, add framework support — вижу только grovee and Kotlin.
IDEA Community Edition? У автора Ultimate и в ней расширенная поддержка фреймворков.
а что же мне делать в таком случае?
Прописать всё руками и добавить зависимости через maven. Или подумать как многие работают с Ultimate IDEA (например можно купить).
Поставил себе Ultimate, почти всё заработало, кроме этого:
Exception in thread «main» java.lang.ExceptionInInitializerError: Initial SessionFactory failedorg.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at HibTestProject.HibernateSessionFactory.buildSessionFactory(HibernateSessionFactory.java:25)
at HibTestProject.HibernateSessionFactory. (HibernateSessionFactory.java:10)
at HibTestProject.AppMain.main(AppMain.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Не пойму, в чём проблема? Подскажите пожалуйста.
Я тоже столкнулся с этой проблемой. Есть предположение, что это связанно с версией драйвера для MySQL. Автор использует версию 5.1.34, я же пытался запустить с версией 6.0.3. Попробуйте изменить версию на более старую, для меня это сработало.
Сергей, по предыдущему пункту с исключениями, в чем была ошибка? Такая же ситуация. Спасибо.
Проблема в том, что idea убирает поля
property name = «connection.username» > root / property >
property name = «connection.password» > admin / property >
Проверьте их наличие, в случае отсутствия таковых- добавьте.
Совсем не знаю maven потому и вопрос, пакет ru.javastudy.hibernate в ручную создаются? или maven’ ом т.к. прописано в pom.xml
И ещё вопрос как в реальных проектах принято добавлять записи в БД через один объект
ContactEntity contactEntity = new ContactEntity ( ) ;
или на каждую запись создавать новый
ContactEntity contactEntity = new ContactEntity ( ) ;
?
в pom.xml прописываются зависимости, которые потом подгрузятся как jar файлы. Пакеты никакие не создаются.
Как писать в базу зависит от того как хранятся объекты и откуда берутся данные и собственно как происходит запись в БД. В общем плодить любые лишние объекты это расход ресурсов.
Ясно, спасибо за быстрый ответ на счёт Maven
Ну допустим данные берутся с формочки из полей text тогда contactEntity должен быть один? и просто его методы подставлять аргументы string и всё?
кстати что то у меня ошибка:
SessionFactory failed org.hibernate.MappingException: Repeated column in mapping for entity: org.learning.hibernate.dao.ContactHobbyDetailEntity column: contact_id (should be mapped with insert=»false» update=»false»)
пытался исправить, что в ошибке требует, не помогло, всё сделал точно так как в туториале тут всё изменил как и написанно:-
Например в JSF у вас будет один ContactEntity с set\get методами. И этот один объект будет изменяться и записываться в базу. Для других случаев может создаваться новый объект для новых данных.
В трейсе ошибки написано что нужно сделать (повторяется колонка и параметры маппинга не те).
параметры маппинга были заданны точ в точ как у вас в туториале 3 раза перепроверял, странно, но вот в классе ContactHobbyDetailEntity действительно сгенерилось немного не так:
@ManyToOne
@JoinColumn(name = «contact_id«, referencedColumnName = «ID«, nullable = false)
public ContactEntity getContactByContactId() <
return contactByContactId;
>
а у вас в исходниках:
@ManyToOne
@JoinColumn(name = «hobby_id«, referencedColumnName = «hobby_id«, nullable = false)
public HobbyEntity getHobbyByHobbyId() <
return hobbyByHobbyId;
>
и название класса другое…странно… с чего бы это… ведь и базу с который генерил у вас же взял…
сменил на @JoinColumn(name = «hobby_id, … ) и всё заработало… станно всё это…
В любом случае спасибо Вам за ваши труды и коментарии
Спасибо, очень полезный туториал! Все заработало, пусть не с первого раза, но заработало) =)!
Тем, кто так и не решил ошибку компиляции даю совет — проверьте настройки hibernate.cfg.xml. Я удалила все xml с настройками для классов, оставила только Entity, то есть только классы. Обнаружила, что у меня не был прописан диалект, логин и пароль. После настройки этого, все заработало.
Подскажите, пожалуйста, информацию по автоматическому созданию связей между таблицами.
Шикарный туториал. Огромное человеческое спасибо!
Огромное Вам спасибо за статью! Но у меня возникла ошибка и не понимаю как её исправить, вроде бы все xml на месте, не могли бы Вы помочь разобраться
авг 20, 2016 4:48:50 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core <5.0.1.Final>
авг 20, 2016 4:48:50 PM org.hibernate.cfg.Environment
INFO: HHH000206: hibernate.properties not found
авг 20, 2016 4:48:50 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
авг 20, 2016 4:48:51 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager
INFO: HCANN000001: Hibernate Commons Annotations <5.0.0.Final>
Exception in thread «main» java.lang.ExceptionInInitializerError: Initial SessionFactory failedorg.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found : ru/javastudy/hibernate/dao/ContactEntity.hbm.xml : origin(ru/javastudy/hibernate/dao/ContactEntity.hbm.xml)
at ru.javastudy.hibernate.utils.HibernateSessionFactory.buildSessionFactory(HibernateSessionFactory.java:28)
at ru.javastudy.hibernate.utils.HibernateSessionFactory. (HibernateSessionFactory.java:13)
at ru.javastudy.hibernate.main.AppMain.main(AppMain.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
В ошибке сказано не найден маппинг ru/javastudy/hibernate/dao/ContactEntity.hbm.xml. Смотрите куда потеряли (или, скорее всего, его не видит приложение). Кстати вполне гуглится куча ответов по этой ошибке…
Здравствуйте. Такой вопрос: можно ли быстро и безболезненно прикрутить к этому проекту Spring MVC, а также заменить БД на Postgresql, или даже и пытаться не стоит?
Можно и это не очень долго. Можете почитать другие статьи по настройке Spring MVC на этом или других сайтах.
у меня аналогичная ошибка:
INFO: HHH000369: Error stopping service [class org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl] : java.lang.NullPointerException
Exception in thread «main» java.lang.ExceptionInInitializerError: Initial SessionFactory failedorg.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at ru.javastudy.hibernate.utils.HibernateSessionFactory.buildSessionFactory(HibernateSessionFactory.java:25)
at ru.javastudy.hibernate.utils.HibernateSessionFactory. (HibernateSessionFactory.java:10)
at ru.javastudy.hibernate.main.AppMain.main(AppMain.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
подскажите, пожалуйста, как поправить
Вставил в сгенерированный hibernate.cfg.xml вот эти строчки и все завелось:
Подскажите, почему после запуска main, программа не завершается? В таблицу данные добавляются, но процесс выполнения не завершается.. Так надо?
поздно, но возможно кому-то понадобится. Сам промучался не меньше часа в поисках.





















