Главная страница
Навигация по странице:

  • Transaction beginTransaction() Начинает транзакцию и возвращает объект Transaction.void cancelQuery()

  • Criteria createCriteria(String entityName) Создание нового экземпляра Criteria для объекта с указанным именем.Criteria createCriteria(Class persistentClass)

  • Serializable getIdentifier(Object object) Возвращает идентификатор данной сущности, как сущности, связанной с данной сессией.void update(String entityName, Object object)

  • Serializable save(Object object) Сохраянет экземпляр, предварительно назначив сгенрированный идентификатор.boolean isOpen()

  • Transaction getTransaction() Получает связанную с этой сессией транзакцию.void refresh(Object object)

  • Query createFilter(Object collection, String queryString)


  • Руководство по Hibernate. Руководство по Hibernate


    Скачать 186.74 Kb.
    НазваниеРуководство по Hibernate
    Дата25.11.2021
    Размер186.74 Kb.
    Формат файлаdocx
    Имя файлаРуководство по Hibernate.docx
    ТипРуководство
    #282046
    страница2 из 7
    1   2   3   4   5   6   7

    Конфигурирование.


    Для корректной работы, мы должны передать Hibernate подробную информацию, которая связывает наши Java-классы c таблицами в базе данных (далее – БД). Мы, также, должны укзать значения определённых свойств Hibernate.

    обычно, вся эта информация помещена в отдельный файл, либо XML-файл – hibernate.cfg.xml, либо – hibernate.properties.

    В этой статье мы рассмотрим конфигурирование приложение с помощью XML-файла hibernate.cfg.xml.

    Для начала рассмотрим ключевые свойства, которые должны быть настроены в типичном приложении:

    hibernate.dialect

    Указывает HIebrnate диалект БД. Hibernate, в своб очередь, генерирует необходимые SQL-запросы (например, org.hibernate.dialect.MySQLDialect, если мы используем MySQL).

    hibernate.connection-driver_class

    Указывает класс JDBC драйвера.

    hibernate.connection.url

    Указывает URL (ссылку) необходимой нам БД (например, jdbc:mysql://localhost:3306/database).

    hibernate.connection.username

    Указывает имя пользователя БД (например, root).

    hibernate.connection.password

    Укащывает пароль к БД (например, password).

    hibernate.connection.pool_size

    Ограничивает количество соединений, которые находятся в пуле соединений Hibernate.

    hibernate.connection.autocommit
    Указывает режим autocommit для JDBC-соединения.

    Давайте рассмотрим пример конфигурационного XML-файла.

    Исходные данные:
    Тип БД: MySQL

    Имя базы данных: database

    Имя пользователя: root

    Пароль: password

     


    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">





    name="hibernate.dialect">

    org.hibernate.dialect.MySQLDialect

    name="hibernate.connection.driver_class">

    com.mysql.jdbc.Driver


    name="hibernate.connection.url">

    jdbc:mysql://localhost/database

    name="hibernate.connection.username">

    root

    name="hibernate.connection.password">

    password




    Сессии.

    В этой статье я решил более подробно остановиться на сессиях (Session). Напомню, что сессия используется для получения физического соединения с базой данных (далее – БД). Благодаря тому, что сессия является легковесны объектом, его создают (открывают сессию) каждый раз, когда возникает необходимость, а потом, когда необходимо, уничтожают (закрывают сессию). Мы создаём, читаем, редактируем и удаляем объекты с помощью сессий.

    Мы стараемся создавать сессии при необходимости, а затем уничтожать их из-за того, что ни не являются потоко-защищёнными и не должны юыть открыты в течение длительного времени.

    Экземпляр класса может находиться в одном из трёх состояний:

    • transient
      Это новый экземпляр устойчивого класса, который не привязан к сессии и ещё не представлен в БД. Он не имеет значения, по которому может быть идентифицирован.

    • persistent
      Мы модем создать преходный экземпляр класса, связав его с сессией. Устойчивый экземпляр класса представлен в БД, а значение идентификатора связано с сессией.

    • detached
      После того, как сессия закрыта, экземпляр класса становится отдельным, независимым экземпляром класса.

    В примитивном виде, транзакция выглядит примерно таким образом:
    Session session = sessionFactory.openSession();

    Transaction transaction = null;

    try{

    transaction = session.beginTransaction();

    /**

    * Here we make some work.

    * */

    transaction.commit();

    }catch(Exception e){

    if(transaction !=null){

    transaction.rollback();

    e.printStackTrace();

    }

    e.printStackTrace();

    }finally{

    session.close();

    }
    В этом примере, в случае исключения, происходит откат (rollback).

    В интерфейсе Session определены 23 метода, которые мы можем использовать:

    Transaction beginTransaction()

    Начинает транзакцию и возвращает объект Transaction.

    void cancelQuery()

    Отменяет выполнение текущего запроса.

    void clear()

    Полностью очищает сессию

     

    Connection close()

    Заканчивает сессию, осовождает JDBC-соединение и выполняет очистку.

    Criteria createCriteria(String entityName)

    Создание нового экземпляра Criteria для объекта с указанным именем.

    Criteria createCriteria(Class persistentClass)

    Создание нового экземпляра Criteria для указанного класса.

    Serializable getIdentifier(Object object)

    Возвращает идентификатор данной сущности, как сущности, связанной с данной сессией.

    void update(String entityName, Object object)

    Обновляет экземпляр с идентификатором, указанном в аргументе.

    void update(Object object)

    Обновляет экземпляр с идентификатором, указанном в аргументе.

    void saveOrUpdate(Object object)

    Созраняет или обновляет указанный экземпляр.

    Serializable save(Object object)

    Сохраянет экземпляр, предварительно назначив сгенрированный идентификатор.

    boolean isOpen()

    Проверяет открыта ли сессия.

    boolean isDirty()

    Проверят, есть ли в данной сессии какие-либо изменения, которые должны быть синхронизованы с базой данных (далее – БД).

    boolean isConnected()

    Проверяет, подключена ли сессия в данный момент.

    Transaction getTransaction()

    Получает связанную с этой сессией транзакцию.

    void refresh(Object object)

    Обновляет состояние экземпляра из БД.

    SessionFactory getSessionFactory()

    Возвращает фабрику сессий (SessionFactory), которая создала данную сессию.

    Session get(String entityName, Serializable id)

    Возвращает созранённый экземпляр с указанными именем сущности и идентификатором. Если таких сохранённых экземпляров нет – возвращает null.

    void delete(String entityName, Object object)

    Удаляет сохранённый экземпляр из БД.

    void delete(Object object)

    Удаляет сохранённый экземпляр из БД.

    SQLQuery createSQLQuery(String queryString)

    Создаёт новый экземпляр SQL-запроса (SQLQuery) для данной SQL-строки.

    Query createQuery(String queryString)

    Создаёт новый экземпляр запроса (Query) для данной HQL-строки.

    Query createFilter(Object collection, String queryString)

    Создаёт новый экземпляр запроса (Query) для данной коллекции и фильтра-строки.

     

    В этой статье мы ознакомились с основными понятиями, связанными с объектом Session.

    Сохраняемые классы.

    Ключевая функция Hibernate заключается в том, что мы можем взять занчения из нашего Java-класса и созранить их в таблице базы данных (далее – БД). С помощью конфигурационных файлов мы указываем Hibernate как извлечь данные из класса и соединить с определённым столбцами в таблице БД.

    Если мы хотим, чтобы экземпляры (объекты) Java-класса в будущем созранялся в таблице БД, то мы называем их “сохранямые классы” (persistent class). Для того, чтобы сделать работу с Hibernate аксимально удобной и эффективной, мы следует использовать программную молель Простых Старых Java Объектов (Plain Old Java Object – POJO).

    Сущесвуют определённые требования к POJO классам. Вот самые главные из них:

    • Все классы должны иметь ID для простой идентификации наших объектов в БД и в Hibernate. Это поле класса соединяется с первичным ключём (primary key) таблицы БД.

    • Все POJO – классы должны иметь конструктор по умолчанию (пустой).

    • Все поля POJO – классов должны иметь модификатор доступа private иметь набор getter-ов и setter-ов в стиле JavaBean.

    • POJO – классы не должны содержать бизнес-логику.

    Мы называем классы POJO для того, чтобы подчеркнуть тот факт, что эти объекты являются экземплярами обычных Java-классов.

    Ниже приведён пример POJO – класса, которые соотвтетствует условиям, написанным выше:
    package net.proselyte.hibernate.pojo;
    public class Developer {

    private int id;

    private String firstName;

    private String lastName;

    private String specialty;

    private int experience;
    /**

    * Default Constructor

    */

    public Developer() {

    }
    /**

    * Plain constructor

    */

    public Developer(int id, String firstName, String lastName, String specialty, int experience) {

    this.id = id;

    this.firstName = firstName;

    this.lastName = lastName;

    this.specialty = specialty;

    this.experience = experience;

    }

    /**

    * Getters and Setters

    */

    public int getId() {

    return id;

    }
    public void setId(int id) {

    this.id = id;

    }
    public String getFirstName() {

    return firstName;

    }
    public void setFirstName(String firstName) {

    this.firstName = firstName;

    }
    public String getLastName() {

    return lastName;

    }
    public void setLastName(String lastName) {

    this.lastName = lastName;

    }
    public String getSpecialty() {

    return specialty;

    }
    public void setSpecialty(String specialty) {

    this.specialty = specialty;

    }
    public int getExperience() {

    return experience;

    }
    public void setExperience(int experience) {

    this.experience = experience;

    }
    /**

    * toString method (optional)

    */

    @Override

    public String toString() {

    return "Developer{" +

    "id=" + id +

    ", firstName='" + firstName + '\'' +

    ", lastName='" + lastName + '\'' +

    ", specialty='" + specialty + '\'' +

    ", experience=" + experience +

    '}';

    }

    }

    В этой статье мы рассмотрели основные понятия созраняемых классов (persistent classes).

    Соединяющие файлы.

    Чаще всего, когда мы имеем дело с ORM фреймворком, связи между объектами и таблицами в базе данных (далее – БД) указываются в XML – файле.
    Давайте рассмотрим наш предыдущий POJO – класс Developer.java
    package net.proselyte.hibernate.pojo;
    public class Developer {

    private int id;

    private String firstName;

    private String lastName;

    private String specialty;

    private int experience;
    /**

    * Default Constructor

    */

    public Developer() {

    }
    /**

    * Plain constructor

    */

    public Developer(int id, String firstName, String lastName, String specialty, int experience) {

    this.id = id;

    this.firstName = firstName;

    this.lastName = lastName;

    this.specialty = specialty;

    this.experience = experience;

    }

    /**

    * Getters and Setters

    */

    public int getId() {

    return id;

    }
    public void setId(int id) {

    this.id = id;

    }
    public String getFirstName() {

    return firstName;

    }
    public void setFirstName(String firstName) {

    this.firstName = firstName;

    }
    public String getLastName() {

    return lastName;

    }
    public void setLastName(String lastName) {

    this.lastName = lastName;

    }
    public String getSpecialty() {

    return specialty;

    }
    public void setSpecialty(String specialty) {

    this.specialty = specialty;

    }
    public int getExperience() {

    return experience;

    }
    public void setExperience(int experience) {

    this.experience = experience;

    }
    /**

    * toString method (optional)

    */

    @Override

    public String toString() {

    return "Developer{" +

    "id=" + id +

    ", firstName='" + firstName + '\'' +

    ", lastName='" + lastName + '\'' +

    ", specialty='" + specialty + '\'' +

    ", experience=" + experience +

    '}';

    }

    }

    Тперь создадим таблицу в БД под названием HIBERNATE_DEVELOPERS:
    CREATE TABLE HIBERNATE_DEVELOPERS(

    ID INT NOT NULL AUTO_INCREMENT,

    FIRST_NAME VARCHAR(50) DEFAULT NULL,

    LAST_NAME VARCHAR(50) DEFAULT NULL,

    SPECIALTY VARCHAR(50) DEFAULT NULL,

    EXPERIENCE INT DEFAULT NULL,

    PRIMARY KEY(ID)

    );
    На данный момент у нас есть две независимых друг от друга сущности: POJO – класс Developer.java и таблица в БД HIBERNATE_DEVELOPERS.

    Для того, чтобы связать их друг с другом и получить возможность сохранять значения полей класса, нам необходимо объяснить, как именно это делать Hibernate фреймворку.
    ЧТобы это сделать, мы создаём конфигурационной XML – файл Developer.hbm.xml
    Вот этот файл:


    "-//Hibernate/Hibernate Mapping DTD//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">







    This class contains developer's details.












    На данный момент мы ещё не можем сказать, что наше приложение готово, но у нас есть часть необходимых конфигураций. Давайте разберем их.


    • Это ключевой тег , который должен быть в каждом XML – фалйе для связывания (mapping). Внутри этого тега мы и конфигурируем наши связи.


    • Тег используется для того, чтоы указать связь между POJO – классов и таблицей в БД. Имя класса указывается с помощью свойства name, имя таблицы в БД – с помощью свойства table.


    • Опциональный (необязательный) тег, внутри которого мы можем добавить описание класса.


    • Тег связывает уникальный идентификатор ID в POJO – классе и первичный ключ (primary key) в таблице БД. Свойство name соединяет поле класса со свойством column, которое указывает нам колонку в таблице БД. Свойство type определяет тип связывания (mapping) и используется для конфертации типа данных Java в тип данных SQL.


    • Этот тег внутри тега используется для того, что генерировать первичные ключи автоматически. Если мы указываем это свойство native, как в примере, приведённом выше, то Hibernate сам выберет алгоритм (identity, hilo, sequence) в зависимости от возможностей БД.



    • Мы используем этот тег для того, чтобы связать (map) конкретное поле POJO – класса с конкретной колонкой в таблице БД. Свойство name указывает поле в классе, в то время как свойство column указывает на колонку в таблице БД. Свойство type указывает тип связывания (mapping) и конвертирует тип данных Java в тип данных SQL.

    Существуют также и другие теги, которые могут быть использованы в конфигурационном XML – файле, которые не были указаны в этой теме. Но в течение всего цикла статей, посвящённых Hibernate, мы постараемся поговорить о большинстве из них.
    А в этой статье мы ознакомились с основами применения созединящих файлов (mapping files).
    1   2   3   4   5   6   7


    написать администратору сайта