Поиск по сайту:

JPA EntityManager — Hibernate EntityManager


JPA EntityManager лежит в основе Java Persistence API. Hibernate — наиболее широко используемая реализация JPA.

JPA EntityManager

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

Методы JPA EntityManager

JPA EntityManager поддерживается следующим набором методов. Для удобства чтения я не упомянул аргументы метода.

  1. persist – сделать экземпляр управляемым и постоянным.
  2. merge — объединяет состояние данного объекта с текущим контекстом сохраняемости.
  3. remove — удалить экземпляр сущности.
  4. find — поиск по первичному ключу. Поиск объекта указанного класса и первичного ключа. Если экземпляр сущности содержится в контексте постоянства, он возвращается оттуда.
  5. getReference — возвращает и экземпляр, который лениво извлекается и вызывает исключение EntityNotFoundException при первом доступе к экземпляру.
  6. flush — синхронизирует контекст сохраняемости с базой данных.
  7. setFlushMode — установить режим сброса для всех объектов контекста постоянства.
  8. getFlushMode — получить режим сброса для всех объектов контекста постоянства.
  9. lock — блокирует экземпляр объекта, содержащийся в контексте сохраняемости, с указанным типом режима блокировки.
  10. обновить — обновляет состояние экземпляра из базы данных, а также перезаписывает изменения объекта.
  11. clear — очищает контекст сохраняемости, в результате чего все управляемые объекты становятся отсоединенными. Изменения, внесенные в объекты, которые не были сброшены в базу данных, не будут сохранены.
  12. отсоединить — это похоже на метод очистки, за исключением того, что объект, который ранее ссылался на отсоединенный объект, будет продолжать это делать.
  13. содержит — проверяет, принадлежит ли управляемый объект текущему контексту сохраняемости.
  14. getLockMode — получить текущий режим блокировки для экземпляра сущности.
  15. setProperty — задайте свойство или подсказку диспетчера сущностей.
  16. getProperties — получить свойства и подсказки, связанные с диспетчером сущностей.
  17. createQuery — создание экземпляра Query для выполнения оператора языка запросов Java Persistence.
  18. createNamedQuery — создание экземпляра Query для выполнения оператора именованного языка запросов Java Persistence.
  19. createNativeQuery — создание экземпляра Query для выполнения собственной инструкции SQL.
  20. createNamedStoredProcedureQuery — создание экземпляра StoredProcedureQuery для выполнения хранимой процедуры в базе данных.
  21. createStoredProcedureQuery — создание экземпляра StoredProcedureQuery для выполнения хранимой процедуры в базе данных.
  22. joinTransaction — указывает менеджеру объекта, что транзакция JTA активна. Этот метод следует вызывать в диспетчере объектов, управляемом приложением JTA, который был создан вне области действия активной транзакции, чтобы связать его с текущей транзакцией JTA.
  23. isJoinedToTransaction — определяет, связан ли entityManager с текущей транзакцией.
  24. unwrap – возвращает объект указанного типа, чтобы разрешить доступ к специфичному для поставщика API.
  25. getDelegate — возвращает объект поставщика для entityManager.
  26. close — закрыть управляемый приложением entityManager.
  27. isOpen — определяет, открыт ли entityManager.
  28. getTransaction — возвращает объект EntityTransaction на уровне ресурсов.
  29. getEntityManagerFactory — предоставляет фабрику менеджера сущностей для менеджера сущностей.
  30. getCriteriaBuilder — возвращает экземпляр CriteriaBuilder для создания объектов CriteriaQuery.
  31. getMetamodel — возврат экземпляра интерфейса Metamodel для доступа к метамодели единицы сохраняемости.
  32. createEntityGraph — возвращает изменяемый EntityGraph, который можно использовать для динамического создания EntityGraph.
  33. getEntityGraph — возвращает именованный объект entityGraph

Давайте рассмотрим некоторые методы в примере проекта EntityManager.

Пример Hibernate EntityManager

CREATE TABLE `employee` (
  `employee_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `employee_name` varchar(32) NOT NULL DEFAULT '',
  PRIMARY KEY (`employee_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Это очень простая таблица, но она подходит для нашего примера, чтобы продемонстрировать использование EntityManager.

Зависимости Hibernate Maven

Нам нужно будет включить зависимости java-драйвера Hibernate и MySQL в наш файл pom.xml. Я использую Hibernate 5 с последней версией jar mysql-connector-java.

<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>hibernate-entitymanager</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>hibernate-entitymanager</name>
	<url>https://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- MySQL connector -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.5</version>
		</dependency>
		<!-- Hibernate 5.2.6 Final -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.2.6.Final</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<sourceDirectory>src/main/java</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Сохранение режима гибернации.xml

Наиболее важной частью использования спящего режима является предоставление файла persistence.xml. Этот xml содержит конфигурацию для подключения к базе данных.

<persistence xmlns="https://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/persistence
             https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
	version="2.1">

	<persistence-unit name="persistence">
		<description>Hibernate Entity Manager Example</description>
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Test" />
			<property name="javax.persistence.jdbc.user" value="journaldev" />
			<property name="javax.persistence.jdbc.password" value="journaldev" />
			<property name="hibernate.show_sql" value="true" />
		</properties>

	</persistence-unit>

</persistence>

  • hibernate.show_sql используется, чтобы указать hibernate печатать запросы sql в файлы журнала или консоль.
  • Самой важной конфигурацией является класс provider, то есть org.hibernate.jpa.HibernatePersistenceProvider. Вот как Hibernate подключается к нашему приложению для использования в качестве реализации JPA.
  • Есть свойства для подключения к вашей базе данных и драйвер для использования.
  • Важно отметить, что persistence.xml следует поместить в каталог META-INF, как видно из изображения проекта.

Hibernate Entity Bean

Теперь мы создадим класс Employee.java, который будет соответствовать таблице сотрудников, созданной в базе данных. Класс сотрудника объявляется как сущность с помощью аннотации @Entity.

package com.journaldev.jpa.hibernate.model;

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

@Entity
@Table(name = "employee")
public class Employee {
	private int employeeId;

	private String name;

	@Id
	@Column(name = "employee_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getEmployeeId() {
		return employeeId;
	}

	public void setEmployeeId(int employeeId) {
		this.employeeId = employeeId;
	}

	@Column(name = "employee_name")
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Employee [employeeId=" + employeeId + ", name=" + name + "]";
	}

}

Теперь пришло время создать нашу основную программу и выполнить несколько запросов, используя методы EntityManager.

package com.journaldev.jpa.hibernate.main;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.journaldev.jpa.hibernate.model.Employee;

public class App {
	public static void main(String[] args) {
		EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
		EntityManager entityManager = entityManagerFactory.createEntityManager();

		System.out.println("Starting Transaction");
		entityManager.getTransaction().begin();
		Employee employee = new Employee();
		employee.setName("Pankaj");
		System.out.println("Saving Employee to Database");

		entityManager.persist(employee);
		entityManager.getTransaction().commit();
		System.out.println("Generated Employee ID = " + employee.getEmployeeId());

		// get an object using primary key.
		Employee emp = entityManager.find(Employee.class, employee.getEmployeeId());
		System.out.println("got object " + emp.getName() + " " + emp.getEmployeeId());

		// get all the objects from Employee table
		@SuppressWarnings("unchecked")
		List<Employee> listEmployee = entityManager.createQuery("SELECT e FROM Employee e").getResultList();

		if (listEmployee == null) {
			System.out.println("No employee found . ");
		} else {
			for (Employee empl : listEmployee) {
				System.out.println("Employee name= " + empl.getName() + ", Employee id " + empl.getEmployeeId());
			}
		}
		// remove and entity
		entityManager.getTransaction().begin();
		System.out.println("Deleting Employee with ID = " + emp.getEmployeeId());
		entityManager.remove(emp);
		entityManager.getTransaction().commit();

		// close the entity manager
		entityManager.close();
		entityManagerFactory.close();

	}
}

  1. Persistence.createEntityManagerFactory предоставит экземпляр EntityManagerFactory, используя persistence-unit, который мы предоставили в файле persistence.xml
  2. entityManagerFactory.createEntityManager() создаст экземпляр EntityManager для использования. Каждый раз, когда мы вызываем метод createEntityManager(), он возвращает новый экземпляр EntityManager.
  3. Метод
  4. entityManager.getTransaction().begin() сначала извлекает транзакцию из текущего контекста сохраняемости, а затем начинает транзакцию с помощью метода begin().
  5. entityManager.persist(employee) используется для сохранения объекта сотрудника в базе данных.
  6. Метод
  7. entityManager.getTransaction.commit() используется для получения транзакции, а затем для ее фиксации. Это зафиксирует все изменения в базе данных.
  8. entityManager.find() используется для поиска объекта в базе данных с использованием первичного ключа.
  9. Если вы хотите написать собственный запрос, мы можем использовать для него метод entityManager.createQuery(). Здесь важно отметить, что метод createQuery() будет иметь имя, указанное в классе сущности, а не фактическое имя таблицы.
  10. entityManager.remove() следует использовать только тогда, когда нам нужно удалить объект из базы данных.
  11. entityManager.close() используется для закрытия диспетчера сущностей. Аналогичным образом entityManagerFactory.close() должен закрыть EntityManagerFactory. Мы должны закрыть эти ресурсы, как только закончим с ними.

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

Starting Transaction
Saving Employee to Database
Hibernate: insert into employee (employee_name) values (?)
Generated Employee ID = 11
got object Pankaj 11
Dec 07, 2017 1:05:23 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select employee0_.employee_id as employee1_0_, employee0_.employee_name as employee2_0_ from employee employee0_
Employee name= Test, Employee id 5
Employee name= Pankaj, Employee id 6
Employee name= Pankaj, Employee id 11
Deleting Employee with ID = 11
Hibernate: delete from employee where employee_id=?

Обратите внимание, как генерируется идентификатор сотрудника, когда он сохраняется в базе данных, а затем сопоставляется с объектом. Также обратите внимание на то, что SQL-запросы выводятся в консоль. Обратите внимание, что Hibernate будет создавать больше журналов, но я не помещал их здесь для удобства чтения. Это все, что касается JPA EntityManager и его примера с реализацией спящего режима. Вы можете загрузить окончательный пример проекта Hibernate EntityManager по ссылке ниже.

Скачать пример проекта JPA Hibernate EntityManager

Ссылка: документ API