Поиск…


замечания

Компонент SessionFactory отвечает за создание, поддержание, закрытие и очистку всех сеансов базы данных, которые TransactionManager запрашивает для создания. Вот почему мы autowire SessionFactory в DAO и запускаем все запросы через него.

Один из самых больших вопросов, который задают новые пользователи Hibernate, - «Когда мои изменения совершаются?» и ответ имеет смысл, когда вы думаете, как TransactionManager работает с SesisonFactory . Изменения в базе данных будут @Transactional при выходе из метода службы, который был аннотирован с помощью @Transactional . Причиной этого является то, что транзакция должна представлять собой единую «единицу» непрерывной работы. Если что-то пойдет не так с устройством, тогда предполагается, что устройство потерпело неудачу, и все изменения должны быть отменены. Таким образом SessionFactory будет очищать и очищать сеанс при выходе из метода службы, который вы назвали первоначально.

Это не означает, что он не будет очищать и очищать сессию во время вашей транзакции. Например, если я вызову метод службы, чтобы добавить коллекцию из 5 объектов и вернуть общее количество объектов в базе данных, SessionFactory поймет, что запрос ( SELECT COUNT(*) ) требует, чтобы обновленное состояние было точным, и так что сбросьте добавление 5 объектов перед запуском запроса на подсчет. Исполнение может выглядеть примерно так:

Версии

Версия Ссылка на документацию Дата выхода
4.2.0 http://hibernate.org/orm/documentation/4.2/ 2013-03-01
4.3.0 http://hibernate.org/orm/documentation/4.3/ 2013-12-01
5.0.0 http://hibernate.org/orm/documentation/5.0/ 2015-09-01

Использование конфигурации XML для настройки спящего режима

Я создаю файл с именем database-servlet.xml где database-servlet.xml то в пути к классам.

Первоначально ваш файл конфигурации будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

</beans>

Вы заметите, что я импортировал пространства имен tx и jdbc Spring. Это связано с тем, что мы будем использовать их довольно сильно в этом файле конфигурации.

Первое, что вы хотите сделать, это включить управление транзакциями на основе аннотаций ( @Transactional ). Основная причина, по которой люди используют Hibernate весной, - это то, что Spring будет управлять всеми вашими транзакциями для вас. Добавьте в конфигурационный файл следующую строку:

<tx:annotation-driven />

Нам нужно создать источник данных. Источником данных является база данных, которую Hibernate собирается использовать для сохранения ваших объектов. Обычно один менеджер транзакций будет иметь один источник данных. Если вы хотите, чтобы Hibernate разговаривал с несколькими источниками данных, у вас есть несколько менеджеров транзакций.

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
</bean>

Класс этого компонента может быть любым, что реализует javax.sql.DataSource чтобы вы могли написать свой собственный. Этот примерный класс предоставляется Spring, но не имеет собственного пула потоков. Популярной альтернативой является Apache Commons org.apache.commons.dbcp.BasicDataSource , но есть и многие другие. Я объясню каждое из свойств ниже:

  • driverClassName : путь к вашему драйверу JDBC. Это JAR, специфичный для базы данных, который должен быть доступен в вашем пути к классам. Убедитесь, что у вас самая последняя версия. Если вы используете базу данных Oracle, вам понадобится OracleDriver. Если у вас есть база данных MySQL, вам понадобится MySQLDriver. Смотрите , если вы можете найти нужный драйвер здесь , но быстрый Google должен дать вам правильный драйвер.

  • url : URL-адрес вашей базы данных. Обычно это будет нечто вроде jdbc\:oracle\:thin\:\path\to\your\database или jdbc:mysql://path/to/your/database . Если вы используете Google по умолчанию для базы данных, которую используете, вы должны знать, что это должно быть. Если вы получаете org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set HibernateException с сообщением org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set и вы следуете этому руководству, вероятность 90% вашего URL неверна, вероятность 5% что ваша база данных не запущена и 5% вероятность неправильного имени пользователя / пароля.

  • имя пользователя : имя пользователя, которое будет использоваться при аутентификации с помощью базы данных.

  • password : пароль для использования при аутентификации с базой данных.

Следующим шагом будет создание SessionFactory . Это то, что Hibernate использует для создания и управления транзакциями и фактически ведет переговоры с базой данных. В нем есть несколько вариантов конфигурации, которые я попытаюсь объяснить ниже.

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="au.com.project />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>
  • dataSource : ваш компонент источника данных. Если вы изменили Идентификатор источника данных, установите его здесь.

  • packagesToScan : пакеты для сканирования, чтобы найти ваши аннотированные объекты JPA. Это те объекты, которые требуется управлять фабрикой сеансов, обычно будут POJO и аннотируются с @Entity . Дополнительные сведения о настройке отношений объектов в Hibernate см. Здесь .

  • annotatedClasses (не показано): вы также можете предоставить список классов для Hibernate для сканирования, если они не все находятся в одном пакете. Вы должны использовать либо packagesToScan либо annotatedClasses но не оба. Декларация выглядит так:

<property name="annotatedClasses">
    <list>
        <value>foo.bar.package.model.Person</value>
        <value>foo.bar.package.model.Thing</value>
    </list>
</property>
  • hibernateProperties : Существует огромное количество всех этих любовно документированных здесь . Основными из них будут следующие:
  • hibernate.hbm2ddl.auto : Один из самых жарких вопросов Hibernate описывает это свойство. См. Дополнительную информацию . Обычно я использую validate и настраиваю свою базу данных с использованием SQL-скриптов (для внутренней памяти) или заранее создавая базу данных (существующая база данных).
  • hibernate.show_sql : Boolean flag, если true Hibernate будет печатать весь SQL, который он генерирует в stdout . Вы также можете настроить регистратор для отображения значений, привязанных к запросам, путем установки log4j.logger.org.hibernate.type=TRACE log4j.logger.org.hibernate.SQL=DEBUG в вашем менеджере журналов (я использую log4j ).
  • hibernate.format_sql : Boolean flag, приведет к тому, что Hibernate будет корректно печатать ваш SQL в stdout.
  • hibernate.dialect (Не показано, по уважительной причине): Многие старые учебники показывают, как установить диалоги Hibernate, которые он будет использовать для связи с вашей базой данных. Hibernate может автоматически определять, какой диалект использовать на основе драйвера JDBC, который вы используете. Поскольку существует около 3 различных диалектов Oracle и 5 разных диалектов MySQL, я бы оставил это решение до Hibernate. Полный список диалектов Hibernate поддерживает смотрите здесь .

Последние 2 бобов, которые вам нужно объявить:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
    id="PersistenceExceptionTranslator" />

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

PersistenceExceptionTranslator переводит исключительные исключения HibernateException или SQLExceptions в Spring, которые могут быть поняты контекстом приложения.

TransactionManager - это то, что контролирует транзакции, а также откаты.

Примечание. Вы должны авторизовать свой компонент SessionFactory в своих DAO.

Конфигурация Hibernate без XML

Этот пример был взят отсюда

package com.reborne.SmartHibernateConnector.utils;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class LiveHibernateConnector implements IHibernateConnector {

    private String DB_DRIVER_NAME = "";
    private String DB_URL = "jdbc:h2:~/liveDB;MV_STORE=FALSE;MVCC=FALSE";
    private String DB_USERNAME = "sa";
    private String DB_PASSWORD = "";
    private String DIALECT = "org.hibernate.dialect.H2Dialect";
    private String HBM2DLL = "create";
    private String SHOW_SQL = "true";
    
    private static Configuration config;
    private static SessionFactory sessionFactory;
    private Session session;
    
    private boolean CLOSE_AFTER_TRANSACTION = false;

    public LiveHibernateConnector() {
        
        config = new Configuration();

        config.setProperty("hibernate.connector.driver_class",         DB_DRIVER_NAME);
        config.setProperty("hibernate.connection.url",                 DB_URL);
        config.setProperty("hibernate.connection.username",         DB_USERNAME);
        config.setProperty("hibernate.connection.password",         DB_PASSWORD);
        config.setProperty("hibernate.dialect",                     DIALECT);
        config.setProperty("hibernate.hbm2dll.auto",                 HBM2DLL);
        config.setProperty("hibernate.show_sql",                    SHOW_SQL);
    
        /*
         * Config connection pools
         */

        config.setProperty("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
        config.setProperty("hibernate.c3p0.min_size", "5");
        config.setProperty("hibernate.c3p0.max_size", "20");
        config.setProperty("hibernate.c3p0.timeout", "300");
        config.setProperty("hibernate.c3p0.max_statements", "50");
        config.setProperty("hibernate.c3p0.idle_test_period", "3000");
        
        
        /**
         * Resource mapping
         */
        
//        config.addAnnotatedClass(User.class);
//        config.addAnnotatedClass(User.class);
//        config.addAnnotatedClass(User.class);
    
        sessionFactory = config.buildSessionFactory();
    }


    public HibWrapper openSession() throws HibernateException {
        return new HibWrapper(getOrCreateSession(), CLOSE_AFTER_TRANSACTION);
    }


    public Session getOrCreateSession() throws HibernateException {
        if (session == null) {
            session = sessionFactory.openSession();
        }
        return session;
    }

    public void reconnect() throws HibernateException {
        this.sessionFactory = config.buildSessionFactory();
    }

    
}

Обратите внимание, что при использовании новейшего Hibernate этот подход работает неэффективно (выпуск Hibernate 5.2 все еще допускает эту конфигурацию)

Простой пример спящего режима с использованием XML

Чтобы настроить простой спящий проект с использованием XML для конфигураций, вам нужно 3 файла, hibernate.cfg.xml, POJO для каждого объекта и EntityName.hbm.xml для каждого объекта. Ниже приведен пример использования MySQL:

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect
   </property>
   <property name="hibernate.connection.driver_class">
      com.mysql.jdbc.Driver
   </property>

   <property name="hibernate.connection.url">
      jdbc:mysql://localhost/DBSchemaName
   </property>
   <property name="hibernate.connection.username">
      testUserName
   </property>
   <property name="hibernate.connection.password">
      testPassword
   </property>

   <!-- List of XML mapping files -->
   <mapping resource="HibernatePractice/Employee.hbm.xml"/>

</session-factory>
</hibernate-configuration>

DBSchemaName, testUserName и testPassword будут заменены. Обязательно используйте полное имя ресурса, если оно находится в пакете.

Employee.java

package HibernatePractice;

public class Employee {
    private int id;
    private String firstName;
    private String middleName;
    private String lastName;
    
    public Employee(){
        
    }
    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 getMiddleName(){
        return middleName;
    }
    public void setMiddleName(String middleName){
        this.middleName = middleName;
    }
    public String getLastName(){
        return lastName;
    }
    public void setLastName(String lastName){
        this.lastName = lastName;
    }
}

Employee.hbm.xml

<hibernate-mapping>
   <class name="HibernatePractice.Employee" table="employee">
      <meta attribute="class-description">
         This class contains employee information. 
      </meta>
      <id name="id" type="int" column="empolyee_id">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="middleName" column="middle_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
   </class>
</hibernate-mapping>

Опять же, если класс находится в пакете, используйте полное имя класса packageName.className.

После того, как у вас есть эти три файла, вы готовы использовать спящий режим в своем проекте.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow