JPA EntityManager - Hibernate EntityManager

2023-11-04

JPA EntityManager 是 Java Persistence API 的核心。休眠是使用最广泛的 JPA 实现。

JPA实体管理器

  • 程序最重要的方面之一是与数据库的连接。数据库连接和与数据库的事务被认为是最昂贵的事务。 ORM 在这方面是一个非常重要的工具。 ORM 有助于用 java 对象表示数据库的关系。
  • ORM 由两个概念组成面向对象和关系编程。
  • Hibernate 是一个 ORM 框架,程序员可以在其中描述对象在数据库中的表示方式。 Hibernate 自动处理转换。
  • Hibernate提供JPA接口的实现EntityManagerFactory and EntityManager.
  • EntityManagerFactory 提供 EntityManager 实例用于连接到同一数据库。所有实例都配置为使用默认实现定义的相同设置。可以准备多个实体管理器工厂来连接到不同的数据存储。
  • JPA EntityManager 用于访问特定应用程序中的数据库。它用于管理持久实体实例、通过主键标识查找实体以及查询所有实体。

JPA EntityManager 方法

JPA EntityManager 由以下一组方法支持。为了更好的可读性,我没有提到方法参数。

  1. persist - 使实例受管理且持久。
  2. merge - 将给定实体的状态合并到当前的持久性上下文中。
  3. 删除 - 删除实体实例。
  4. find - 按主键查找。搜索指定类和主键的实体。如果实体实例包含在持久性上下文中,则从那里返回它。
  5. getReference – 返回延迟获取的实例,并在第一次访问该实例时抛出 EntityNotFoundException。
  6. 刷新 – 将持久性上下文与数据库同步。
  7. setFlushMode – 设置持久化上下文的所有对象的刷新模式。
  8. getFlushMode – 获取持久化上下文中所有对象的刷新模式。
  9. lock - 使用指定的锁定模式类型锁定持久性上下文中包含的实体实例。
  10. 刷新 - 它从数据库刷新实例的状态,也会覆盖对实体的更改。
  11. 清除 - 清除持久性上下文,导致所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会被持久化。
  12. detach——这与clear方法类似,唯一不同的是之前引用分离对象的实体将继续这样做。
  13. contains – 它检查托管实体是否属于当前的持久性上下文。
  14. getLockMode – 获取实体实例的当前锁定模式。
  15. setProperty – 设置实体管理器属性或提示。
  16. getProperties – 获取与实体管理器关联的属性和提示。
  17. createQuery - 创建 Query 实例以执行 Java 持久性查询语言语句。
  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 示例

We will create a maven project for JPA Hibernate EntityManager example, below image illustrates different component of our Eclipse project. JPA EntityManager, Hibernate EntityManager example I am using MySQL for database, below query will create our test table.

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 依赖项

我们必须在 pom.xml 文件中包含 Hibernate 和 MySQL java 驱动程序依赖项。我正在使用 Hibernate 5 和最新版本的 mysql-connector-java jar。

<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>

Hibernate持久化.xml

使用hibernate最重要的部分是提供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实体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 file
  2. entityManagerFactory.createEntityManager()将创建 EntityManager 实例供我们使用。每次我们打电话createEntityManager()方法,它将返回 EntityManager 的新实例。
  3. entityManager.getTransaction().begin()方法首先从当前持久化上下文中提取事务,然后使用 begin() 方法开始事务。
  4. entityManager.persist(employee)用于将员工对象持久保存在数据库中。
  5. entityManager.getTransaction.commit()方法用于获取事务,然后提交同一事务。这会将所有更改提交到数据库。
  6. entityManager.find()用于使用主键在数据库中查找实体。
  7. 如果你想编写自定义查询,我们可以使用entityManager.createQuery()的方法。这里需要注意的重要一点是,createQuery() 方法将具有实体类中给出的名称,而不是实际的表名称。
  8. entityManager.remove()仅当我们必须从数据库中删除实体时才应使用。
  9. 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=?

请注意,当员工 ID 保存到数据库中并映射回对象时,它是如何生成的。另请注意 SQL 查询被打印到控制台中。请注意,Hibernate 会创建更多日志,但为了保持可读性,我没有将它们放在这里。这就是 JPA EntityManager 的全部内容,并且是 hibernate 实现的示例。您可以从下面的链接下载最终的 Hibernate EntityManager 示例项目。

下载 JPA Hibernate EntityManager 示例项目

参考:API Doc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA EntityManager - Hibernate EntityManager 的相关文章

随机推荐

  • Linux 中的 W 命令

    在这篇文章中 我们将讨论w命令 w是一个命令行实用程序 显示有关当前登录用户以及每个用户正在执行的操作的信息 它还提供有关系统已运行多长时间 当前时间和系统平均负载的信息 如何使用w命令 语法为w命令如下 w OPTIONS USER Wh
  • 如何在 CentOS 7 上安装 Skype

    Skype是世界上最受欢迎的通信应用程序之一 可让您免费进行在线音频和视频通话 并以经济实惠的价格拨打全球手机和固定电话 Skype 不是开源应用程序 也不包含在 CentOS 存储库中 本教程介绍如何在 CentOS 7 上安装最新版本的
  • 如何在 Ubuntu 18.04 上设置 OpenVPN 服务器

    无论您是想在连接不可信的公共 Wi Fi 网络时安全可靠地访问互联网 绕过地理限制内容还是允许您的同事在远程工作时安全地连接到您的公司网络 使用 VPN 都是最佳解决方案 VPN 允许您连接到远程 VPN 服务器 使您的连接加密且安全 并通
  • Android布局-LinearLayout、RelativeLayout

    在本教程中 我们将概述 Android 布局 我们还将探索一些可用于组织屏幕内容的特定布局控件 即 Android LinearLayout 和 AndroidrelativeLayout 安卓布局 用户界面的基本构建块是View从 Vie
  • Python 文件操作 - 使用 Python 读取和写入文件

    在本教程中 我们将研究 Python 中的不同文件操作 我们将介绍如何使用 Python 读取文件 写入文件 删除文件等等 所以 事不宜迟 让我们开始吧 在 Python 中处理文件 在之前的教程中 我们使用了控制台接受输入 现在 我们将使
  • 如何在 JavaScript 中编写条件语句

    介绍 在编程中 很多时候您会希望根据用户输入或其他因素运行不同的代码块 例如 如果每个字段都正确填写 您可能希望提交表单 但如果缺少某些必填字段 您可能希望阻止该表单提交 为了完成这样的任务 我们有条件语句 它们是所有编程语言的组成部分 条
  • 如何在 CentOS 7 上使用 Apache 作为带有 mod_proxy 的反向代理

    介绍 A 反向代理是一种代理服务器 它接受 HTTP S 请求并将其透明地分发到一个或多个后端服务器 反向代理非常有用 因为许多现代 Web 应用程序使用后端应用程序服务器处理传入的 HTTP 请求 这些服务器并不意味着用户可以直接访问 并
  • 如何在 Ubuntu 16.04 上安装和配置 Elasticsearch

    介绍 弹性搜索是一个实时分布式搜索和分析数据的平台 它的流行是由于它的易用性 强大的功能和可扩展性 Elasticsearch 支持 RESTful 操作 这意味着您可以将 HTTP 方法 GET POST PUT DELETE 等 与 H
  • 如何在 CentOS 7 上使用 Let's Encrypt 保护 Apache

    介绍 让我们加密是一个证书颁发机构 CA 为以下用户提供免费证书传输层安全 TLS 加密 从而在 Web 服务器上启用加密的 HTTPS 它通过提供可自动执行大部分步骤的软件客户端 简化了证书的创建 验证 签名 安装和续订过程 Certbo
  • 如何在 Ubuntu 12.04 LTS(精确穿山甲)上安装 nginx

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • R 中的 head() 和 tail() 函数 - 详细参考

    The R 中的 head 和 tail 函数通常用于读取数据集的前 n 行和后 n 行 您可能是一名在职专业人员 程序员或新手 但有时您需要阅读大型数据集并对其进行分析 消化一个拥有 20 多列甚至更多列 数千行的庞大数据集确实很困难 本
  • NoSQL 数据库管理系统和模型的比较

    介绍 当大多数人想到数据库时 他们通常会想到传统的关系数据库模型 其中涉及由行和列组成的表 虽然关系数据库管理系统仍然处理互联网上的大部分数据 但近年来 随着开发人员寻求解决关系模型局限性的方法 替代数据模型变得更加普遍 这些非关系数据库模
  • 理解 JavaScript 中的类

    介绍 JavaScript 是一种基于原型的语言 JavaScript 中的每个对象都有一个隐藏的内部属性 称为 Prototype 可用于扩展对象属性和方法 您可以在我们的文章中阅读有关原型的更多信息了解 JavaScript 中的原型和
  • 如何在角度测试中使用 Spies

    介绍 茉莉花间谍用于跟踪或存根函数或方法 间谍是一种检查函数是否被调用或提供自定义返回值的方法 我们可以使用间谍来测试依赖于服务的组件 并避免实际调用服务的方法来获取值 这有助于使我们的单元测试专注于测试组件本身的内部而不是其依赖项 在本文
  • Java 棘手面试问题

    不久前我写过一篇文章前 50 个 Java 编程问题 我们的读者非常喜欢它 所以今天我们将研究一些 Java 面试中棘手的问题 Java 棘手面试问题 这些都是编程问题 但除非您对 Java 有深入的了解 否则很难猜测输出并解释它 1 Nu
  • 了解 JavaScript 中的原型和继承

    介绍 JavaScript 是一个基于原型的语言 这意味着对象属性和方法可以通过具有克隆和扩展能力的通用对象来共享 这称为原型继承 与类继承不同 在流行的面向对象编程语言中 JavaScript 相对独特 因为 PHP Python 和 J
  • 如何在 Python 3 中使用列表方法

    介绍 Python 3 有许多内置数据结构 包括列表 数据结构为我们提供了一种组织和存储数据的方法 我们可以使用内置方法来检索或操作该数据 为了充分利用本教程 您应该熟悉列表数据类型 其语法及其索引方式 您可以通过阅读教程来查看列表理解 P
  • Mockito 教程

    Mockito 是一个基于 java 的模拟框架 与其他测试框架结合使用 例如JUnit and TestNG 它内部使用Java反射API 并允许创建服务对象 模拟对象返回虚拟数据并避免外部依赖 它通过模拟外部依赖项并将模拟应用到被测代码
  • Linux 中的存储术语和概念简介

    介绍 Linux 拥有强大的系统和工具来管理硬件设备 包括存储驱动器 在本文中 我们将从高层次上介绍 Linux 如何表示这些设备以及如何将原始存储转化为服务器上的可用空间 什么是块存储 块存储是 Linux 内核中块设备的另一个名称 A块
  • JPA EntityManager - Hibernate EntityManager

    JPA EntityManager 是 Java Persistence API 的核心 休眠是使用最广泛的 JPA 实现 JPA实体管理器 程序最重要的方面之一是与数据库的连接 数据库连接和与数据库的事务被认为是最昂贵的事务 ORM 在这