Для виконання цього туторіалу необхідні наступні речі:
1) IDE 3.4+ з додатками Spring IDE, m2Eclipse (деталі установки можна знайти в ).
2) 2+
3) 5+
4) 5+
Ці інструменти повинні бути налаштовані та робочі.
Почнемо з створення проекту. В Екліпсі слід вибрати File->New->Other->Maven Project. Create a simple project повинен бути не чектнутий. При потребі можна вказати розташування проекту, відчекнувши Use default Workspace location.
На наступному діалозі слід вибрати архетип maven-archetype-quickstart. Після вибору архетипу необхідно вказати ідентифікатор групи: com.rozrobka та артефакту: hiberdemo.
Коли все вказано, Ексліпс створить проект.
Для того щоб підключити Hibernate та Spring до pom.xml файлу, в корені проекту, слід додати наступний текст у групу :
Це вкаже Maven-у використовувати Hibernate, MySQL бібліотеки та Spring як залежності для проекту.
Можна приступати до створення класів. Моделі будуть розміщуватись у пакеті com.rozrobka.model. Для зручності створимо маркер інтерфейс DataEntity, який будуть реалізовувати класи моделі.
Предметна область у цьому прикладі доволі проста — Оголошення (ad) яке належить до Категорії (category) у співвідношенні багато-до-одного (many-to-one).
Створимо першу модель Category:
Ця модель використовує анотації з пакетів JPA. Hibernate надає реалізації цих анотації, які сумісні з специфікаціями JPA.
Анотація @Entity вказує що цей клас є сутністю. Анонтація @Table дозволяє керувати налаштуваннями мапування сутності на таблицю. В нашому випадку ми вказуємо що сутності Category будуть зберігатись у таблиці caregories.
Далі ідуть анотації рівня полів. @Id вказує що поле є ключовим. @GeneratedValue вказує що значення поля генерується базою даних, наприклад авто-інкремент. Анотація @Column допомагає вказати характеристики поля бази даних, наприклад назву, довжину, можливість пустих значень та інше.
Цей клас представляє оголошення і має звязок з класом Category. Використані подібні анотації як і для Category.
Крім стандартних, для мапування використана анотація @JoinColumn, яка вказує поле яке відповідає за звязок на рівні бази даних, та анотація @ManyToOne, яка вказує мапування на логічному рівні класів.
Обидва класи моделі мають відповідати специфікації JavaBeans, тобто мати правильно проіменовані гетери та сетери та інші речі.
Моделі готові, можна приступити до налаштування Spring.
Для цього слід створити папку resources у папці src/main. У ній слід створити файл appCtx.xml з наступним вмістом:
Це є контекст файл Spring, у якому описуються класи та звязки між ними. Давайте пройдемось по головним бінам.
sessionFactory описує допоміжний Spring клас AnnotationSessionFactoryBean який дає можливість використовувати анотовані моделі. Йому вказуються файли налаштувань та джерело даних.
dataSource визначає джерело даних. Параметри підключення автоматично вказуються Spring-ом на етапі запуску.
hibernatePropertiesConfigurer та propertyConfigurer є допоміжними бінами які допомагають вказати параметри налаштувань Hibernate та джерела даних.
adsDao це є наш бін, який буде містити логіку доступу до бази даних. Його ми зараз створимо.
Для цього у пакеті com.rozrobka.hiberdemo слід стоврити клас AdsDao, який розширяє клас HibernateDaoSupport:
package com.rozrobka.hiberdemo;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.rozrobka.model.Ad;
import com.rozrobka.model.DataEntity;
public class AdsDao extends HibernateDaoSupport {
public void save(DataEntity entity) {
getHibernateTemplate().save(entity);
}
public List<Ad> getAllAds() {
return getHibernateTemplate().loadAll(Ad.class);
}
}
Клас містить два методи: save та getAllAds. За допомогою save можна зберігати всі класи, які реалізують інтерфейс DataEntity, у нашому випадку це Ad та Category.
Метод getAllAds вертає з бази даних всі сутності типу Ad. метод getHibernateTemplate надається суперкласом HibernateDaoSupport і є зручним та практичним шляхом взаємодії з Hibernate.
Реалізація готова. Тепер слід доналаштувати Hibernate та параметри підключення до бази даних.
Для цього створимо у папці resources файл hibernate.cfg.xml з наступним вмістом:
Це є конфігураційний файл Hibernate. У нашому випадку він є малим, так як ми винесли налаштування підєднання до бази даних окремо. Він описує два класи, які є сутностями Hibernate.
Для опису необхідно вказувати канонічну назву класу з назвою пакету.
Далі слід створити додатковий конфігураційний файл hibernate.properties, який міститиме налаштування, які можуть мінятись з часом:
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
# or validate
hibernate.hbm2ddl.auto=update
Цей файл містить три налаштування.
show_sql вказує чи виводити до логу запити які робить Hibernate.
dialect вказує який використовувати діалект SQL. у нашому випадку це діалект MySQL. Для інших типів баз даних слід вибрати інший діалект. Діалект має вплив на згенерований SQL код.
hbm2ddl.auto вказує поведінку при роботі з структурою бази даних. update означає що Hibernate сам згенерує структуру на базі мапувань, або анотації. validate означає, що Hibernate просто перевірить структуру на відповідність моделям.
Далі створимо конфігураційний файл бази даних database.properties:
Вказування розташування файлу контексту, та ініціалізація Spring контексту. ctx.getBean вертає бін по імені з ініціалізованого контексту.
Повернений бін це є наше DAO яке пряцює з Hibernate.
Решта коду взаємодіять з цим DAO: створення та збереження однієї категорії, та створення двох оголошень, визначення звязку з категорією та подальше збереження.
Останні дві стрічки роблять запит до бази даних та перевіряють чи дійсно два оголошення збереглись.
Перед запуском слід створити саму базу даних:
create database hiberdemo;
Коли все готово, запускаємо клас App!
Має бути багато логів на виході, які закінчаться приблизно такими стрічками:
Hibernate: insert into categories (name) values (?)
Hibernate: insert into ads (CLIENT_ID, description, email, name) values (?, ?, ?, ?)
Hibernate: insert into ads (CLIENT_ID, description, email, name) values (?, ?, ?, ?)
Hibernate: select this_.id as id0_1_, this_.CLIENT_ID as CLIENT5_0_1_, this_.description as descript2_0_1_, this_.email as email0_1_, this_.name as name0_1_, category2_.id as id1_0_, category2_.name as name1_0_ from ads this_ inner join categories category2_ on this_.CLIENT_ID=category2_.id
Array size: 2
Cлід памятати що після створення схеми, слід змінити конфігурацію:
Все прикольно, почти, как по часам.
Кстати, я нигде не увидел подключения и конфигурирования логов. При таком раскладе спринги с хибернейтом должны массово ругаться на stdout о невозможности обнаружить реализацию логирования.
Да, еще, на сколько я помню, для данного примера не обязательно указывать аннотацию @Column(name=«ххх»), т.к. поля одноименные.
Но в общем респект. Хороший туториал.
дякую за відгук :)
щодо логів — так, їх буде багато і всі вони підуть в stdout. я спеціально не перевантажував туторіал логуванням, так як планую якось окремо описати підходи до логування. плюс початківцям думаю цікаво буде почитати що відбувається (принаймні мені було цікаво в свій час :) )
Так, для наглядності мабуть треба було декілька «name» забрати, так як JPA/Hibernate має багато конвеншинів та значень по замовчуванню.
вот это было бы реально круто. Ну, мне по крайней мере, т.к. обычно конфигурят только log4j, а остальными системами как-то не интересуются. Мне бы было интересно.
Коментарі (14)
RSS згорнути / розгорнутиlemon
zenyk
Кстати, я нигде не увидел подключения и конфигурирования логов. При таком раскладе спринги с хибернейтом должны массово ругаться на stdout о невозможности обнаружить реализацию логирования.
Да, еще, на сколько я помню, для данного примера не обязательно указывать аннотацию @Column(name=«ххх»), т.к. поля одноименные.
Но в общем респект. Хороший туториал.
afon
щодо логів — так, їх буде багато і всі вони підуть в stdout. я спеціально не перевантажував туторіал логуванням, так як планую якось окремо описати підходи до логування. плюс початківцям думаю цікаво буде почитати що відбувається (принаймні мені було цікаво в свій час :) )
Так, для наглядності мабуть треба було декілька «name» забрати, так як JPA/Hibernate має багато конвеншинів та значень по замовчуванню.
zenyk
afon
serter
zenyk
serter
я не хотів сильно ускладнювати цей туторіал і старався тримати кількість класів малою.
для справжніх проектів, звичайно що треба використовувати універсальні DAO, у випадках подібних до цього
zenyk
zenyk
serter
zenyk
afon
GrAndSE
Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.