День 1. Минимальный проект с использованием java + hibernate + mysql

Исходники можно скачать тут.
В данном посте попытаемся сделать минимум телодвижений для выборки\сохранения данных из бд MySQL с использованием проекта на java и объектно-ориентированного маппинга на Hibernate.
Не будем вдаваться в подробности, а перейдем сразу к делу.
Перед тем, как рассматривать тонкости настройки Hibernate, сперва создадим скелет пустого приложения и настроим базу данных.
Установка MySQL Server и создание базы данных Tutorial
Если еще не стоит MySQL - стягиваем отсюда http://dev.mysql.com/downloads/mirror.php?id=394757#mirrors и устанавливаем. Затем конфигурируем пароль администратора в визарде.
Затем, когда установка завершена, создадим базу данных
Открываем командную строку в фаре или консоли и идем в паку "C:\Program Files\MySQL\MySQL Server 5.1\bin\". Ну или как она там у вас назвалась.
Логинимся под рутом в mysql:
Создаем базу данных с использованием команды
Затем выставляем привилегии на эту базу:
Создаем Java Project в эклипсе
File -> New -> Java Project. Назовем его Hibernate.
Создание первого класса
Создадим сперва класс, который будет представлять событие (просто набор данных), которые будут храниться в базе данных.
Класс этот будет простым JavaBean классом с несколькими свойствами
Этот класс использует стандартные конвенции названия свойств, а также их геттеров и сеттеров. Также используем закрытые поля (private fields).
Хотя такой подход и рекомендуется, он не является обязательным. Hibernate может доступаться к полям напрямую. Свойство id содержит уникальное значение идентификатора для определенного события. Все сохраняемые классы нуждаются в таком идентификаторе. Вообще-то, большинство приложений, особенно веб-приложения, нуждаются в получении объекта по идентификатору.
Hibernate может получать доступ к public, private и protected полям объекта, а также к методам с аналогичными модификаторами доступа.
К сохраняемым классам применяется одно правило: у них обязательно должен быть конструктор без аргументов. Hibernate создает объекты с использованием рефлексии (Java Reflection).
Сохраним этот файл в проекте по пути src/main/java/org/hibernate/tutorial/domain.
Файл маппингов
Hibernate-у нужно знать, как загружать и сохранять объекты сохраняемых классов. Эта роль положена на маппинг-файлы. Эти файлы сообщают хибернейту какую таблицу необходимо использовать в базе данных, а также над какими колонками в таблице производить действия.
Базовая структура такого файла выглядит следующим образом:
DTD в хибернейте сложный. Его можно использовать для автозаполнения элементов XML маппинга в редакторе или IDE. Hibernate не будет подгружать DTD файл из интернета, а сперва попытается найти его в класспасе приложения. Файл DTD включен в hibernate-core.jar (также он включен и в hibernate3.jar).
![]() |
В данном примере мы будем опускать определение DTD в последующих примерах для сокращения кода. Конечно, так делать не стоит. |
Между двумя тегами hibernate-mapping включен элемент class. Все классы-сущности нуждаются в маппинге к таблицам в базе данных.
Этим мы говорим хибернейту о том, как сохранять и загружать объекты класса Event в таблицу EVENTS. Каждый объект теперь представлен в виде записи в таблице. Теперь следует задать маппинг свойства уникального идентификатора к табличному первичному ключу. Поскольку нам не особо хочется заботиться каждый раз о создании уникального ключа, мы настроим хибернейт таким образом, что он будет делать это автоматически.
Элемент id - объявление свойства идентификатора. Атрибут name="id" объявляет имя свойства JavaBean и говорит хибернейту использовать методы getId() и setId() для доступа к свойству. Атрибут column сообщает какую колонку в таблице EVENTS следует использовать для содержания первичного ключа.
Вложенный элемент generator определяет стратегию генерации идентификатора. В нашем случае, мы выбрали native. Эта стратегия предоставляет определенный уровень независимости от выбранного диалекта базы данных.
Последнее, что осталось сделать, так это сообщить об оставшихся полях класса.
Аналогично с элементом id, атрибут name элемента property сообщает о том, какие геттеры и сеттеры следует использовать. В нашем случае, Hibernate будет искать методы getDate(), setDate(), getTitle(), setTitle().
![]() |
Почему маппинг свойства date включает атрибут column, а title - нет? Без атрибута column, Хибернейт по умолчанию использует имя свойства как имя колонки. Это работает для title, однако, date - это зарезервированное слово в большинстве баз данных, поэтому необходимо производить маппинг на другое имя. |
Давайте сохраним файл с маппингами в файл src/main/resources/org/hibernate/tutorial/domain/Event.hbm.xml нашего проекта.
Настройка Hibernate
Пришло время настроить сам hibernate.
В нашем примере, мы будем использовать встроенный пул соединений. Для настройки мы можем использовать обычный hibernate.properties файл или более сложный hibernate.cfg.xml.
Большинство пользователей предпочитают XML файлы.
Положим hibernate.cfg.xml в папку src (в корень).
И наполним следующим содержимым:
Не забудьте пароль поставить на свой!
Запуск
Самое время загрузить и сохранить некоторые объекты Event, но сперва необходимо дописать немного кода. Создадим класс-помощник, который позаботиться о доступе к org.hibernate.SessionFactory.
Кладем файл в src/main/java/org/hibernate/tutorial/util/HibernateUtil.java
Этот класс всего лишь отдает глобальную ссылку на org.hibernate.SessionFactory в статическом инициализаторе. Сделаем сокрытие получения фабрики как при использовании JNDI в серверах приложений.
Загрузка и сохранение объектов
Теперь мы готовы начать реальную работу с хибернейтом. Напишем класс EventManager с main() методом:
В методе createAndStoreEvent() мы создали новый объект Event и отправили путешествовать через хибернейт. Начиная с этого момента, хибернейт берет на себя всю рутину по работе с SQL.
org.hibernate.Session спроектирован для того, чтобы представлять неделимую единицу работы. Для поддержания транзакции, мы используем org.hibernate.Transaction API. В данном случае мы используем транзакционную симантеку стиля JDBC, но ничто не запрещает использовать JTA.
Что делает sessionFactory.getCurrentSession()? Этот метод всегда возвращает "текущую" единицу работу. Поясним. В конфигурационном файле hibernate.cfg.xml мы переключили опцию механизма на "thread". Согласно этой настройке, контекст текущей единицы работы привязан к текущему потоку Java, в котором выполняется приложение.
Интересно, а org.hibernate.Session можно использовать только для одной операции или для многих? В нашем случае мы использовали одну операцию. Вообще, следует использовать получение сессии как можно реже, а выполнять как можно больше операций для одной сессии.
Давайте немного поменяем класс EventManager и добавим условие для вывода результатов из базы:
Теперь, если передать в командной строке параметр load, то будут загружены все записи.
В этом куске кода мы использовали Hibernate Query Language (HQL) для загрузки всех существующих объектов Event из базы данных. Hibernate сгенерирует необходимый SQL, отошлет его в базу данных. а затем заполнит результатами объекты Event. Вообще, с использованием языка HQL можно создавать гораздо более сложные запросы.
P.S: Тут не описаны подключаемые библиотеки. Их реально много. Предполагается, что вы сами сможете найти недостающие jar-ники.
Материалы, которые могут вас заинтересовать
- День 2. Маппинг ассоциаций в hibernate
- Grails. Включаем SQL Logging.
- Ленивая инициализация или Lazy Initialization в Hibernate
- Hibernate. Many-to-one ассоциации
- Почему локальные вложенные классы имеют доступ только к final переменным?
- Java .class file version или под какую джаву скомпилирован класс?
- Играем в компилятор. Часть 3.
- Elementary Java.
- Играем в компилятор. Часть 2.









вот уж не мог себе такое представить это прям ужас какой то спасибо за информацию
Отправить комментарий