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 можно увидеть здесь. Описание аннотаций связей между сущностями с примерами представлено здесь. |
