Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

Список полученных сертификатов находится на странице Вашего профиля. Сертификаты можно распечатать или разместить на Вашем сайте.

Лента обновлений
ссылка 15:38:56
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:11:57
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:03:58
Добавлен вопрос в тест C# - Средний уровень
ссылка 14:51:10
Комментарий от olegchap:
Совершенно правы. Опечатка. Спасибо за сигнал. Исправил...
ссылка 12:12:41
Комментарий от lenarikil:
"Вы как нибудь сами скомпилируйте, а то у меня лапки" ...
Статистика

Тестов: 153, вопросов: 8581. Пройдено: 393520 / 1913910.

Hibernate 3: введение и написания Hello world приложения

head tail Статья
категория
Java
дата24.11.2014
авторnvgup
голосов15

Hibernate начат в 2001 году Гэвином Кингом в качестве альтернативы использования Entity Bean. Тогда его задача состояла в том, чтобы предложить лучшую персистентность данных по сравнению с EJB2 за счет упрощения сложности и позволения опускать некоторые особенности. Hibernate использует файлы сопоставление и конфигурации чтобы достичь своих целей. С введением аннотаций в Java Community начиная с JDK 1.5, Hibernate сообщество начало работать на Hibernate 3, который имеет поддержку аннотаций.

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

    Разделы:

  • Что такое Hibernate
  • Как Hibernate работает
  • Архитектура Hibernate
  • Связь с JPA
  • Написания нашей первой программы

Что такое Hibernate

Hibernate является инструментом объектно-реляционного отображения для Java с открытым исходным кодом. Он предоставляет фреймворк для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных. Hibernate не только заботится об отражении классов Java в таблицы БД (и типов данных Java в типы данных SQL), но также обеспечивает запрос данных и поисковые средства и может значительно сократить время разработки которое тратится на ручное написание SQL и JDBC кода.

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

Как Hibernate работает

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

Существует простой, интуитивно понятный API в Hibernate для выполнения запросов к объектам, представленных в базе данных. Чтобы изменить эти объекты, вы просто взаимодействуете с ними, как правило, в программе, а затем говорите Hibernate сохранить изменения. Процесс создание новых объектов аналогично простой: вы просто создаете их в обычном порядке и говорите Hibernate о них с помощью аннотаций, таким образом, они могут быть сохранены в БД.

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

архитектура hibernate

Вышеприведенная схема показывает комплексную архитектуруHibernate. Вот некоторые определения объектов, которые изображены на ней:

Приложение (Application):

Основное приложение, состоит из всех написанных пользователем Java файлов и других ресурсов.

Переходные объекты (Transient Objects):

Экземпляры долгоживущих классов, которые в настоящее время не связаны c Cессией. Они, возможно, были инициализированы в приложении и еще не сохранены, или же они были инициализированы закрытой Cессией.

Постоянные объекты (Persistent objects):

Короткоживущие, однопоточные объекты, содержащие постоянное состояние и бизнес-функции. Это могут быть простые Java Beans/POJOs (Plain Old Java Object). Они связаны только с одной Cессией. После того, как Cессия закрыта, они будут отделены и свободны для использования в любом протоколе прикладного уровня (например, в качестве объектов передачи данных в и из представления).

SessionFactory:

Потокобезопасный, неизменный кэш скомпилированных отображений для одной базы данных. Фабрика для Cессий и клиент для ConnectionProvider, SessionFactory может содержать дополнительный (второй уровень) кэш данных, который используется повторно между операциями в процессе или группой уровней.

Cессиея (Session):

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

TransactionFactory:

(Необязательный) Фабрика для экземпляров Transaction. Интерфейс не открыт для приложения, но может быть расширен или реализован разработчиком.

ConnectionProvider:

(Необязательный) Фабрика и пул JDBC соединений. Интерфейс абстрагирует приложение от основного источника данных или диспетчера драйверов. Он не открыт для приложения, но может быть расширен или реализован разработчиком.

Трансакция (Transaction):

(Необязательный) Однопоточный, короткоживущий объект, используемый приложением для указания atomic переменных работы. Он абстрагирует приложение от основных JDBC, JTA или CORBA трансакций. Сессия может охватывать несколько Трансакций в некоторых случаях. Тем не менее, разграничение транзакций, также используемое в основах API или Transaction, всегда обязателно.

Связь с JPA

JPA (Java Persistence API) - интерфейс, который предоставляет возможность сохранять объекты. Hibernate является одной из реализаций JPA. Вы можете аннотировать ваши классы сколько угодно используя JPA аннотации, однако без реализации ничего не случится. Воспринимайте JPA как руководящие принципы, которые должны соблюдаться или реализовываться, в то время как Hibernate это код, который соответствует API и обеспечивает сокрытие функциональности.

При использовании Hibernate с JPA вы на самом деле используете реализацию JPA. Преимуществом этого является то, что вы можете поменять Hibernate на любую другую реализацию JPA спецификации. При использовании Hibernate напрямую, вы замыкаетесь в реализации, потому что другие ORMs (англ. object-relational mapping, рус. объектно-реляционное отображение) могут использовать не такие методы / конфигурации и аннотации, вследствие чего вы не можете просто переключиться на другой ORM.

Написания нашей первой программы

Таким образом, мы получили хороший обзор: что такое Hibernate и кое-что о нем. Пора сделать некоторую практическую работу. Давайте создадим наше первое Hello world приложения. В этом приложении я создал класс Employee и объявил четыре атрибуты:

  • id
  • email
  • имя
  • фамилия

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

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

  1. hibernate.cfg.xml // Этот файл конфигурации будет использоваться для хранения информации о подключении к базе данных и о настройке уровня схемы.
  2. EmployeeEntity.java // Этот класс будет классом JAVA POJO, имеющий Hibernate аннотации.
  3. HibernateUtil.java // Этот класс будет иметь вспомогательные методы, которые будут использоваться для создания фабрик и объектов Сессии.
  4. TestHibernate.java // Этот класс будет использоваться для проверки наших параметров конфигурации и аннотаций сущности Emplyee.

Перед тем, как перейти к коду, давайте посмотрим, как настраивать проект и додавать Maven зависимости, которые должны быть добавлены в pom.xml, чтобы включить все зависимости во время компиляции и выполнения.

Создание Maven проекта

создание maven проекта

Делаем проект поддерживаемым в Eclipse

поддердка в Eclipse

Теперь импортируем Java проект в рабочее пространство Eclipse

импорт Java проекта в Eclipse

Вышеуказанные действия будут создавать минимальные настройки. Теперь пришло время добавить Hibernate зависимости.

Maven зависимости в pom.xml


<dependency>
	<groupid>org.hibernate</groupid>
	<artifactid>hibernate-commons-annotations</artifactid>
	<version>3.0.0.ga</version>
</dependency>
<dependency>
	<groupid>org.hibernate</groupid>
	<artifactid>hibernate-annotations</artifactid>
	<version>3.3.0.ga</version>
</dependency>
<dependency>
	<groupid>mysql</groupid>
	<artifactid>mysql-connector-java</artifactid>
	<version>5.1.6</version>
</dependency>
<dependency>
	<groupid>antlr</groupid>
	<artifactid>antlr</artifactid>
	<version>2.7.6</version>
</dependency>
<dependency>
	<groupid>commons-collections</groupid>
	<artifactid>commons-collections</artifactid>
	<version>3.1</version>
</dependency>
<dependency>
	<groupid>dom4j</groupid>
	<artifactid>dom4j</artifactid>
	<version>1.6.1</version>
</dependency>
<dependency>
	<groupid>javassist</groupid>
	<artifactid>javassist</artifactid>
	<version>3.4.GA</version>
</dependency>
<dependency>
	<groupid>javax.transaction</groupid>
	<artifactid>jta</artifactid>
	<version>1.1</version>
</dependency>
<dependency>
	<groupid>org.slf4j</groupid>
	<artifactid>slf4j-api</artifactid>
	<version>1.5.6</version>
</dependency>
<dependency>
	<groupid>org.slf4j</groupid>
	<artifactid>slf4j-log4j12</artifactid>
	<version>1.5.6</version>
</dependency>

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

Добавление 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.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatetest</property>
        <property name="hibernate.connection.password">lg225295</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
        <mapping class="hibernate.test.dto.EmployeeEntity"></mapping>
    </session-factory>
</hibernate-configuration>

Не забудьте установить правильный пароль перед запуском приложения.

Добавление EmployeeEntity.java


package hibernate.test.dto;

import java.io.Serializable;

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;

import org.hibernate.annotations.OptimisticLockType;

@Entity
@org.hibernate.annotations.Entity(optimisticLock = OptimisticLockType.ALL)
@Table(name = "Employee", uniqueConstraints = {
		@UniqueConstraint(columnNames = "ID"),
		@UniqueConstraint(columnNames = "EMAIL") })
public class EmployeeEntity implements Serializable {

	private static final long serialVersionUID = -1798070786993154676L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID", unique = true, nullable = false)
	private Integer employeeId;

	@Column(name = "EMAIL", unique = true, nullable = false, length = 100)
	private String email;

	@Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
	private String firstName;

	@Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
	private String lastName;

	// Accessors and mutators for all four fields
}

Добавление HibernateUtil.java


package hibernate.test;

import java.io.File;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
	private static final SessionFactory sessionFactory = buildSessionFactory();

	private static SessionFactory buildSessionFactory() {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			return new AnnotationConfiguration().configure(
					new File("hibernate.cgf.xml")).buildSessionFactory();

		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static void shutdown() {
		// Close caches and connection pools
		getSessionFactory().close();
	}
}

Пожалуйста, исправьте путь к hibernate.cfg.xml.

Тестирование нашего кода


package hibernate.test;

import hibernate.test.dto.EmployeeEntity;
import org.hibernate.Session;

public class TestHibernate {

	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		// Add new Employee object
		EmployeeEntity emp = new EmployeeEntity();
		emp.setEmail("demo-user@mail.com");
		emp.setFirstName("demo");
		emp.setLastName("user");

		session.save(emp);

		session.getTransaction().commit();
		HibernateUtil.shutdown();
	}
}

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


Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)

Исходники к статье

Оригинал статьи на английском

Если Вам понравилась статья, проголосуйте за нее

Голосов: 15  loading...
chernichenko   kozak_dp   kart   octavian007   bolshevik   Victor_MM   Jack_killer   iceknight   or4ini   alyssatkch   Molot_ua   PREDATORik   Halim   rodan1994   cadet_84