Руководство Hibernate для начинающих

Добро пожаловать в руководство Hibernate для начинающих. Hibernate – один из самых широко используемых инструментов Java ORM. Большинство приложений используют реляционные базы данных для хранения информации, а на низком уровне мы используем JDBC API для подключения к базам данных и выполнения операций CRUD.

Руководство Hibernate для начинающих

Если посмотреть на код JDBC, там так много шаблонного кода, и существует вероятность утечки ресурсов и несогласованности данных, потому что все работы должны выполняться разработчиком. Вот где пригодится инструмент ORM. Отображение объектов на реляционные таблицы или ORM – это программная техника отображения объектов модели приложения на реляционные таблицы базы данных. Hibernate – это инструмент ORM на языке Java, который предоставляет среду для отображения объектов модели приложения на реляционные таблицы и наоборот. Некоторые из преимуществ использования Hibernate в качестве инструмента ORM:

  1. Hibernate поддерживает отображение классов Java на базы данных и наоборот. Он предоставляет возможности для выполнения операций CRUD во всех основных реляционных базах данных.
  2. Hibernate устраняет всю шаблонную часть кода, связанную с JDBC, и заботится о управлении ресурсами, поэтому мы можем сосредоточиться на бизнес-сценариях, а не на том, чтобы убедиться, что операции с базой данных не вызывают утечек ресурсов.
  3. Hibernate поддерживает управление транзакциями и гарантирует отсутствие несогласованных данных в системе.
  4. Поскольку мы используем XML, файлы свойств или аннотации для сопоставления классов Java с таблицами базы данных, это предоставляет уровень абстракции между приложением и базой данных.
  5. Hibernate помогает нам в сопоставлении соединений, коллекций, объектов наследования, и мы легко можем визуализировать, как наши модельные классы представляют таблицы базы данных.
  6. Hibernate предоставляет мощный язык запросов (HQL), аналогичный SQL. Однако HQL полностью объектно-ориентирован и понимает концепции, такие как наследование, полиморфизм и ассоциация.
  7. Hibernate также предлагает интеграцию с некоторыми внешними модулями. Например, Hibernate Validator – это эталонная реализация проверки бинов (JSR 303).
  8. Hibernate – это проект с открытым исходным кодом от сообщества Red Hat, который используется по всему миру. Это делает его лучшим выбором, поскольку кривая обучения небольшая, и в форумах легко найти множество онлайн-документации и помощи.
  9. Hibernate легко интегрируется с другими фреймворками Java EE, настолько популярен, что Spring Framework предоставляет встроенную поддержку интеграции Hibernate с приложениями Spring.

I hope all the above benefits will convince you that Hibernate is the best choice for your application object-relational mapping requirements. Let’s look at the Hibernate Framework architecture now and then we will jump into sample project where we will look into different ways to configure Hibernate in standalone java application and use it.

Архитектура Hibernate

Ниже представлена архитектура Hibernate и его работа в качестве абстрактного слоя между классами приложения и API JDBC/JTA для операций с базой данных. Очевидно, что Hibernate построен поверх API JDBC и JTA. Давайте посмотрим на основные компоненты архитектуры Hibernate по очереди.

  • SessionFactory (org.hibernate.SessionFactory): SessionFactory – это неизменный потокобезопасный кеш скомпилированных сопоставлений для одной базы данных. Мы можем получить экземпляр org.hibernate.Session, используя SessionFactory.
  • Session (org.hibernate.Session): Session – это однопоточный, краткоживущий объект, представляющий собой диалог между приложением и постоянным хранилищем. Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction.
  • Постоянные объекты: Постоянные объекты – это краткоживущие однопоточные объекты, содержащие постоянное состояние и бизнес-функции. Они могут быть обычными JavaBeans/POJO. Они ассоциированы ровно с одним org.hibernate.Session.
  • Временные объекты: Временные объекты – это экземпляры постоянных классов, которые в настоящее время не связаны с сеансом org.hibernate.Session. Они могут быть созданы приложением и еще не быть сохранены, или они могут быть созданы закрытым org.hibernate.Session.
  • Транзакция (org.hibernate.Transaction): Транзакция – это однопоточный объект, существующий недолго, используемый приложением для указания атомарных единиц работы. Он абстрагирует приложение от основной JDBC или JTA транзакции. org.hibernate.Session может охватывать несколько org.hibernate.Transaction в некоторых случаях.
  • Поставщик подключений (org.hibernate.connection.ConnectionProvider): Поставщик подключений – это фабрика JDBC подключений. Он обеспечивает абстракцию между приложением и основным javax.sql.DataSource или java.sql.DriverManager. Он не виден приложению, но его можно расширить разработчиком.
  • Фабрика транзакций (org.hibernate.TransactionFactory): Фабрика экземпляров org.hibernate.Transaction.

Hibernate и Java Persistence API (JPA)

Гибернейт предоставляет реализацию Java Persistence API, поэтому мы можем использовать аннотации JPA с бинами модели, и Hibernate позаботится о его настройке для использования в операциях CRUD. Мы рассмотрим это на примере аннотаций.

Пример Hibernate

При разработке приложений на Hibernate нам необходимо предоставить два набора конфигураций. Первый набор конфигураций содержит специфические для базы данных свойства, которые будут использоваться для создания объектов подключения к базе данных и сеансов. Второй набор конфигураций содержит отображение между классами модели и таблицами базы данных. Мы можем использовать XML- или настройки на основе свойств для конфигураций, связанных с подключением к базе данных. Мы можем использовать XML- или аннотационные конфигурации для предоставления классов модели и отображения таблиц базы данных. Мы будем использовать аннотации JPA из javax.persistence для аннотационных отображений. Наш конечный проект будет выглядеть примерно как на изображении ниже. Создайте проект Maven в Eclipse или вашей любимой среде разработки, вы можете выбрать любое имя по вашему выбору. Прежде чем мы перейдем к различным компонентам проекта, нам нужно настроить базу данных.

Настройка таблицы базы данных

В моем примере я использую базу данных MySQL, и ниже приведен сценарий для создания необходимой таблицы.

CREATE TABLE `Employee` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  `insert_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

Обратите внимание, что столбец “id” таблицы Employee автоматически генерируется MySQL, поэтому нам не нужно его вставлять.

Зависимости проекта Hibernate

Наш окончательный файл pom.xml выглядит следующим образом.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.journaldev.hibernate</groupId>
  <artifactId>HibernateExample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>HibernateExample</name>
  
  <dependencies>
  	<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.5.Final</version>
  	</dependency>
  	<!-- Hibernate 4 uses Jboss logging, but older versions slf4j for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
        	<groupId>mysql</groupId>
        	<artifactId>mysql-connector-java</artifactId>
        	<version>5.0.5</version>
        </dependency>
  </dependencies>
  
  <build>
  	<finalName>${project.artifactId}</finalName>
  </build>
</project>

Артефакт hibernate-core содержит все основные классы Hibernate, поэтому мы получим все необходимые функции, включив его в проект. Обратите внимание, что я использую последнюю версию Hibernate (4.3.5.Final) для моего образца проекта, и Hibernate по-прежнему развивается, и я видел, что множество основных классов меняются между каждым основным выпуском. Поэтому, если вы используете другую версию, есть небольшой шанс, что вам придется изменить конфигурации Hibernate для его работы. Однако я уверен, что это будет работать хорошо для всех версий 4.x.x. Hibernate 4 использует регистрацию JBoss, но более старые версии используют slf4j для регистрации, поэтому я включил артефакт slf4j-simple в свой проект, хотя это и не требуется, потому что я использую Hibernate 4. mysql-connector-java – это драйвер MySQL для подключения к базам данных MySQL. Если вы используете другую базу данных, добавьте соответствующий артефакт драйвера.

Классы модели домена

Как вы можете видеть на изображении выше, у нас есть два класса модели, Employee и Employee1. Employee – это простой класс Java Bean, и мы будем использовать конфигурацию на основе XML для предоставления информации о его сопоставлении. Employee1 – это java bean, в котором поля аннотированы аннотациями JPA, так что нам не нужно предоставлять сопоставление в отдельном XML-файле.

package com.journaldev.hibernate.model;

import java.util.Date;

public class Employee {

	private int id;
	private String name;
	private String role;
	private Date insertTime;
	
	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 getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
	
}

Класс Employee – это простой класс Java Bean, здесь нет ничего специфического для обсуждения.

package com.journaldev.hibernate.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="Employee", 
	   uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})
public class Employee1 {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID", nullable=false, unique=true, length=11)
	private int id;
	
	@Column(name="NAME", length=20, nullable=true)
	private String name;
	
	@Column(name="ROLE", length=20, nullable=true)
	private String role;
	
	@Column(name="insert_time", nullable=true)
	private Date insertTime;
	
	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 getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
}

Аннотация javax.persistence.Entity используется для пометки класса как сущности, которая может быть сохранена с помощью Hibernate, поскольку Hibernate предоставляет реализацию JPA. Аннотация javax.persistence.Table используется для определения сопоставления таблицы и уникальных ограничений для столбцов. Аннотация javax.persistence.Id используется для определения первичного ключа для таблицы. javax.persistence.GeneratedValue используется для определения того, что поле будет автоматически генерироваться, и используется стратегия GenerationType.IDENTITY, чтобы сгенерированное значение “id” было сопоставлено с бином и можно было получить в программе Java. javax.persistence.Column используется для сопоставления поля с столбцом таблицы, мы также можем указать длину, допустимость наличия значений и уникальность для свойств бина.

Конфигурация сопоставления Hibernate XML

Как указано выше, мы будем использовать конфигурацию на основе XML для сопоставления класса Employee. Мы можем выбрать любое имя, но лучше выбирать имя с таблицей или именем Java Bean для ясности. Наш файл сопоставления Hibernate для бина Employee выглядит следующим образом. employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.journaldev.hibernate.model.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="role" type="java.lang.String">
            <column name="ROLE" />
        </property>
        <property name="insertTime" type="timestamp">
        	<column name="insert_time" />
        </property>
    </class>
</hibernate-mapping>

Конфигурация XML проста и выполняет ту же функцию, что и конфигурация на основе аннотаций.

Файлы конфигурации Hibernate

Мы создадим два файла конфигурации Hibernate XML – один для конфигурации на основе XML и другой для конфигурации на основе аннотаций. hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		<!-- Connection Pool Size -->
		<property name="hibernate.connection.pool_size">1</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Outputs the SQL queries, should be disabled in Production -->
		<property name="hibernate.show_sql">true</property>
		
		<!-- Dialect is required to let Hibernate know the Database Type, MySQL, Oracle etc
			Hibernate 4 automatically figure out Dialect from Database Connection Metadata -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

		<!-- mapping file, we can use Bean annotations too --> 
		<mapping resource="employee.hbm.xml" />
	</session-factory>
</hibernate-configuration>

Большинство свойств относятся к конфигурациям базы данных, другие подробности свойств приведены в комментарии. Обратите внимание на конфигурацию файла сопоставления Hibernate, мы можем определить несколько файлов сопоставления Hibernate и настроить их здесь. Также обратите внимание, что сопоставление специфично для фабрики сессий. hibernate-annotation.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Mapping with model class containing annotations -->
		<mapping class="com.journaldev.hibernate.model.Employee1"/>
	</session-factory>
</hibernate-configuration>

Большинство конфигураций такие же, как конфигурация на основе XML, единственное отличие – конфигурация сопоставления. Мы можем предоставить конфигурацию сопоставления как для классов, так и для пакетов.

Фабрика сеансов Hibernate

I have created a utility class where I am creating SessionFactory from XML based configuration as well as property based configuration. For property based configuration, we could have a property file and read it in the class, but for simplicity I am creating Properties instance in the class itself.

package com.journaldev.hibernate.util;

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import com.journaldev.hibernate.model.Employee1;

public class HibernateUtil {

	// Конфигурация на основе XML
	private static SessionFactory sessionFactory;
	
	// Конфигурация на основе аннотации
	private static SessionFactory sessionAnnotationFactory;
	
	// Конфигурация на основе свойств
	private static SessionFactory sessionJavaConfigFactory;

    private static SessionFactory buildSessionFactory() {
        try {
            // Создание фабрики сеансов из hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate.cfg.xml");
        	System.out.println("Hibernate Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            // Убедитесь, что вы регистрируете исключение, так как его могут поглотить
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static SessionFactory buildSessionAnnotationFactory() {
    	try {
            // Создание фабрики сеансов из hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate-annotation.cfg.xml");
        	System.out.println("Hibernate Annotation Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate Annotation serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            // Убедитесь, что вы регистрируете исключение, так как его могут поглотить
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}

    private static SessionFactory buildSessionJavaConfigFactory() {
    	try {
    	Configuration configuration = new Configuration();
		
		// Создание свойств, их также можно считывать из файлов свойств
		Properties props = new Properties();
		props.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		props.put("hibernate.connection.url", "jdbc:mysql://localhost/TestDB");
		props.put("hibernate.connection.username", "pankaj");
		props.put("hibernate.connection.password", "pankaj123");
		props.put("hibernate.current_session_context_class", "thread");
		
		configuration.setProperties(props);
		
		// Мы можем установить файл сопоставления или класс с аннотацией
		// метод addClass(Employee1.class) будет искать ресурс
		// com/journaldev/hibernate/model/Employee1.hbm.xml (не рекомендуется)
		configuration.addAnnotatedClass(Employee1.class);
		
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    	System.out.println("Hibernate Java Config serviceRegistry created");
    	
    	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    	
        return sessionFactory;
    	}
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}
    
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
	
	public static SessionFactory getSessionAnnotationFactory() {
		if(sessionAnnotationFactory == null) sessionAnnotationFactory = buildSessionAnnotationFactory();
        return sessionAnnotationFactory;
    }
	
	public static SessionFactory getSessionJavaConfigFactory() {
		if(sessionJavaConfigFactory == null) sessionJavaConfigFactory = buildSessionJavaConfigFactory();
        return sessionJavaConfigFactory;
    }
	
}

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

  1. Создание объекта Configuration и его настройка
  2. Создание объекта ServiceRegistry и применение настроек конфигурации.
  3. Используйте configuration.buildSessionFactory(), передавая объект ServiceRegistry в качестве аргумента, чтобы получить объект SessionFactory.

Наше приложение почти готово, давайте напишем несколько тестовых программ и выполним их.

Тест конфигурации Hibernate XML

Наша тестовая программа выглядит следующим образом.

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;

import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.setName("Pankaj");
		emp.setRole("CEO");
		emp.setInsertTime(new Date());
		
		// Получить сессию
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		// начать транзакцию
		session.beginTransaction();
		// Сохранить объект модели
		session.save(emp);
		// Зафиксировать транзакцию
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		// завершить фабрику сессий, иначе программа не завершится
		HibernateUtil.getSessionFactory().close();
	}

}

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

May 06, 2014 12:40:06 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:40:06 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 06, 2014 12:40:07 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
May 06, 2014 12:40:08 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
Hibernate serviceRegistry created
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
May 06, 2014 12:40:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:40:08 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:40:08 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select max(ID) from EMPLOYEE
Hibernate: insert into EMPLOYEE (NAME, ROLE, insert_time, ID) values (?, ?, ?, ?)
Employee ID=19
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

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

Тест аннотации конфигурации Hibernate

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateAnnotationMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("David");
		emp.setRole("Developer");
		emp.setInsertTime(new Date());
		
		// Получить сессию
		SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
		Session session = sessionFactory.getCurrentSession();
		// начать транзакцию
		session.beginTransaction();
		// Сохранить объект модели
		session.save(emp);
		// Зафиксировать транзакцию
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		// завершить фабрику сессий, иначе программа не завершится
		sessionFactory.close();
	}

}

Когда мы выполняем вышеуказанную программу, мы получаем следующий вывод.

May 06, 2014 12:42:22 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:42:22 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:23 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:42:23 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:42:23 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:42:23 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=20
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

Посмотрите на вывод и сравните его с выводом из конфигурации на основе XML, вы заметите некоторые различия. Например, мы не устанавливаем размер пула подключений для конфигурации на основе аннотаций, поэтому он устанавливается на значение по умолчанию – 20.

Тестирование конфигурации Hibernate на Java

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateJavaConfigMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		// Получить сессию
		SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
		Session session = sessionFactory.getCurrentSession();
		// Начать транзакцию
		session.beginTransaction();
		// Сохранить объект модели
		session.save(emp);
		// Зафиксировать транзакцию
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		// Завершить фабрику сессий, иначе программа не завершится
		sessionFactory.close();
	}

}

Вывод вышеуказанной тестовой программы:

May 06, 2014 12:45:09 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:45:09 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Hibernate Java Config serviceRegistry created
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:45:10 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:45:10 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:45:10 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=21
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

Это все для руководства Hibernate для начинающих, я надеюсь, что этого будет достаточно, чтобы вы начали. Мы рассмотрим различные возможности Hibernate в будущих учебниках. Загрузите полный проект по ссылке ниже и попробуйте поиграть с ним, чтобы узнать больше.

Скачать проект Hibernate для начинающих

Source:
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginners