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 поддерживается следующим набором методов. Для удобства чтения я не упомянул аргументы метода.
- persist – сделать экземпляр управляемым и постоянным.
- merge — объединяет состояние данного объекта с текущим контекстом сохраняемости.
- remove — удалить экземпляр сущности.
- find — поиск по первичному ключу. Поиск объекта указанного класса и первичного ключа. Если экземпляр сущности содержится в контексте постоянства, он возвращается оттуда.
- getReference — возвращает и экземпляр, который лениво извлекается и вызывает исключение EntityNotFoundException при первом доступе к экземпляру.
- flush — синхронизирует контекст сохраняемости с базой данных.
- setFlushMode — установить режим сброса для всех объектов контекста постоянства.
- getFlushMode — получить режим сброса для всех объектов контекста постоянства.
- lock — блокирует экземпляр объекта, содержащийся в контексте сохраняемости, с указанным типом режима блокировки.
- обновить — обновляет состояние экземпляра из базы данных, а также перезаписывает изменения объекта.
- clear — очищает контекст сохраняемости, в результате чего все управляемые объекты становятся отсоединенными. Изменения, внесенные в объекты, которые не были сброшены в базу данных, не будут сохранены.
- отсоединить — это похоже на метод очистки, за исключением того, что объект, который ранее ссылался на отсоединенный объект, будет продолжать это делать.
- содержит — проверяет, принадлежит ли управляемый объект текущему контексту сохраняемости.
- getLockMode — получить текущий режим блокировки для экземпляра сущности.
- setProperty — задайте свойство или подсказку диспетчера сущностей.
- getProperties — получить свойства и подсказки, связанные с диспетчером сущностей.
- createQuery — создание экземпляра Query для выполнения оператора языка запросов Java Persistence.
- createNamedQuery — создание экземпляра Query для выполнения оператора именованного языка запросов Java Persistence.
- createNativeQuery — создание экземпляра Query для выполнения собственной инструкции SQL.
- createNamedStoredProcedureQuery — создание экземпляра StoredProcedureQuery для выполнения хранимой процедуры в базе данных.
- createStoredProcedureQuery — создание экземпляра StoredProcedureQuery для выполнения хранимой процедуры в базе данных.
- joinTransaction — указывает менеджеру объекта, что транзакция JTA активна. Этот метод следует вызывать в диспетчере объектов, управляемом приложением JTA, который был создан вне области действия активной транзакции, чтобы связать его с текущей транзакцией JTA.
- isJoinedToTransaction — определяет, связан ли entityManager с текущей транзакцией.
- unwrap – возвращает объект указанного типа, чтобы разрешить доступ к специфичному для поставщика API.
- getDelegate — возвращает объект поставщика для entityManager.
- close — закрыть управляемый приложением entityManager.
- isOpen — определяет, открыт ли entityManager.
- getTransaction — возвращает объект EntityTransaction на уровне ресурсов.
- getEntityManagerFactory — предоставляет фабрику менеджера сущностей для менеджера сущностей.
- getCriteriaBuilder — возвращает экземпляр CriteriaBuilder для создания объектов CriteriaQuery.
- getMetamodel — возврат экземпляра интерфейса Metamodel для доступа к метамодели единицы сохраняемости.
- createEntityGraph — возвращает изменяемый EntityGraph, который можно использовать для динамического создания EntityGraph.
- 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();
}
}
Persistence.createEntityManagerFactory
предоставит экземпляр EntityManagerFactory, используяpersistence-unit
, который мы предоставили в файлеpersistence.xml
entityManagerFactory.createEntityManager()
создаст экземпляр EntityManager для использования. Каждый раз, когда мы вызываем методcreateEntityManager()
, он возвращает новый экземпляр EntityManager. Метод entityManager.getTransaction().begin()
сначала извлекает транзакцию из текущего контекста сохраняемости, а затем начинает транзакцию с помощью метода begin().entityManager.persist(employee)
используется для сохранения объекта сотрудника в базе данных. Метод entityManager.getTransaction.commit()
используется для получения транзакции, а затем для ее фиксации. Это зафиксирует все изменения в базе данных.entityManager.find()
используется для поиска объекта в базе данных с использованием первичного ключа.- Если вы хотите написать собственный запрос, мы можем использовать для него метод
entityManager.createQuery()
. Здесь важно отметить, что метод createQuery() будет иметь имя, указанное в классе сущности, а не фактическое имя таблицы. entityManager.remove()
следует использовать только тогда, когда нам нужно удалить объект из базы данных.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