410013796724260
• Webmoney
R335386147728
Z369087728698
Пример HibernateРассмотрим разработку Hibernate примера в среде Eclipse. Основная цель, которую будем преследовать в данном Hibernate примере - показать технологию использования библиотеки по записи объектов в таблицу БД, чтению объектов таблицы, поиску объекта по идентификатору записи ID. На следующем скриншоте представлена структура проекта HibernateExample в среде разработки IDE Eclipse. Hibernate пример включает :
В качестве СУБД в примере будем использовать MySQL. В БД создадим таблицу "test.person" в схеме "test". Конечно, таблицу можно было бы также создать с использованием Hibernate, но в данном примере мы это не будем рассматривать. Исходный код примера можно скачать здесь. Описание таблицы базы данныхCREATE TABLE test.person ( id INT (11) NOT NULL, name VARCHAR (128) NOT NULL, PRIMARY KEY (id) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; Тестовая таблица "person" будет включать два поля : идентификатор записи "id" и имя "name". Записи в таблице будут храниться в кодировке "UTF8". Исходный код объекта/классаСоздадим класс Person с полями id - идентификатор записи и name - имя. Класс, с которым работает Hibernate, называется сущностью Entity. Для того, чтобы класс Person стал сущностью, добавим аннотацию @Entity. Сущности типа Person будут храниться в таблице, имя которой совпадает с именем класса, т.е. "person". Значения полей сущностей будут храниться в одноименных колонках этой же таблицы. Сущность должна иметь "persistence identity", или идентификатор. Это - ключ, который однозначно её идентифицирует и выделяет среди других сущностей такого же типа. Идентификатор указывается с помощью аннотации @Id. В классе "Person" в качестве идентификатора можно использовать поле id, которое соответствует колонке первичного ключа в таблице "test.person". import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Person { @Id int id; String name; public Person() {} public Person(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Person {id = " + String.valueOf(id) + ", name = '" + name + "'}"; } } Конфигурационный файл объектаXML-файл person.hbm.xml определяет "package" расположения объекта, "class" объекта и в теге <table> таблицу БД, в которой хранятся (отображаются) Person-объекты. Также в файле определяются связи полей Person-объекта со столбцами таблицы. <?xml version='1.0'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="net.common.model"> <class name="Person" table="person"> <id name="id" type="int" column="id" > <generator class="assigned" /> </id> <property name="name" > <column name="Name" /> </property> </class> </hibernate-mapping> Конфигурационный файл hibernate.cfg.xmlКонфигурационный XML-файл hibernate.cfg.xml определяет параметры СУБД, учетную запись (login, password) подключения к серверу БД, а также дополнительные параметры, которые используются при работе с сервером. <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <!-- JDBC connection pool (use the built-in) --> <property name="hibernate.connection.pool_size">1</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.connection.CharSet">utf8</property> <property name="hibernate.connection.characterEncoding">utf8</property> <property name="hibernate.connection.useUnicode">true</property> <mapping class="net.common.model.Person" /> </session-factory> </hibernate-configuration> В файле конфигурации hibernate.cfg.xml определена база данных MySQL, пул подключений - 1 соединение. В свойстве "show_sql" устанавливаем истиное значение, чтобы в консоли были отображены генерируемые библиотекой Hibernate SQL-скрипты. Дополнительно устанавливаем кодировку записей UTF8, чтобы можно было бы работать с кириллицей. Тестирование Hibernate примераСоздадим класс "PersonTest" для проверки работы библиотеки. В методе main() вызывается конструктор класса, в котором вызывается метод createHibernateSession() для создания сессии Session. Если сессия создана успешно, то в методе recordsAdd() в таблицу БД добавляются два объекта. Подробно о состоянии сущности, сессии Session, ее методах перевода сущности из одного состояния в другое, представлено здесь. После создания сессии в методе recordsRead() объекты из БД "загружаются" в коллекцию и отображаются в консоли. В заключении программа вызывает метод recordFind(final int id) для поиска в таблице БД объекта по идентификатору записи и завершает работу - закрывает сессию. import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import net.common.model.Person; public class PersonTest { private Session session = null; private final String[][] persons = {{"12", "Вильям"}, {"14", "Шекспир"}}; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура создания сессии * @return org.hibernate.Session */ private Session createHibernateSession() { SessionFactory sessionFactory = null; ServiceRegistry serviceRegistry = null; try { try { Configuration cfg = new Configuration(). addResource("person.hbm.xml").configure(); serviceRegistry = new StandardServiceRegistryBuilder(). applySettings(cfg.getProperties()).build(); sessionFactory = cfg.buildSessionFactory(serviceRegistry); } catch (Throwable e) { System.err.println("Failed to create sessionFactory object." + e); throw new ExceptionInInitializerError(e); } session = sessionFactory.openSession(); System.out.println("Создание сессии"); } catch (Exception e) { System.out.println(e.getMessage()); } return session; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура добавления записей в таблицу */ private void recordsAdd() { try { System.out.println("Добавление записи в таблицу БД"); Transaction tx = session.beginTransaction(); for (int i = 0; i < persons.length; i++) { Person person = new Person(); person.setId(Integer.valueOf(persons[i][0])); person.setName(persons[i][1]); session.save(person); } tx.commit(); System.out.println("\tЗаписи добавлены"); } catch (Exception e) { System.out.println(e.getMessage()); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура чтения записей */ private void recordsRead() { System.out.println("\nЧтение записей таблицы"); String query = "select p from " + Person.class.getSimpleName() + " p"; @SuppressWarnings("unchecked") List<Person> list = (List<Person>)session.createQuery(query).list(); System.out.println(list); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Процедура поиска записи */ private void recordFind(final int id) { System.out.println("\nЧтение записи таблицы по ID"); Person person = (Person) session.load(Person.class, id); System.out.println(person); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * Конструктор класса */ public PersonTest() { // Создание сессии session = createHibernateSession(); if (session != null) { // Добавление записей в таблицу recordsAdd(); // Чтение записей таблицы recordsRead(); // Поиск записи по идентификатору recordFind(Integer.valueOf(persons[1][0])); // Закрытие сессии if (session.isOpen()) session.close(); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public static void main(String[] args) { new PersonTest(); System.exit(0); } } Для того, чтобы действия над сущностями сохранялись в базе данных, методы для создания, изменения и удаления сущностей должны вызываться в транзакциях. Для открытия и закрытия транзакций используются методы beginTransaction() и commit() объекта Transaction Следует обратить внимание на то, как объект сохраняется в таблице БД, как читается список объектов и как выполняется поиск объекта по идентификатору. // сохранение объекта в таблице : recordsAdd() session.save(person); // чтение списка объектов : recordsRead List<Person> list = (List<Person>)session.createQuery(query).list(); // чтение объекта по идентификатору : recordFind Person person = (Person) session.load(Person.class, id); В консоли будут отражены следующие результаты работы приложения : Создание сессии Добавление записи в таблицу БД Hibernate: insert into person (Name, id) values (?, ?) Hibernate: insert into person (Name, id) values (?, ?) Записи добавлены Чтение записей таблицы Hibernate: select person0_.id as id1_0_, person0_.Name as Name2_0_ from person person0_ [Person {id = 12, name = 'Вильям'}, Person {id = 14, name = 'Шекспир'}] Чтение записи таблицы по ID Person {id = 14, name = 'Шекспир'} Автоматически генерируемые библиотекой SQL-скрипты отображены в консоли после ключевого слова "Hibernate". Чтобы блокировать "вывод" SQL-скриптов необходимо свойству "show_sql" в файле конфигурации присвоить значение false. Пример использования генератора последовательностей Sequence в Hibernate можно увидеть здесь. Описание аннотаций связей между сущностями с примерами представлено здесь. |