JPA EntityManager 是 Java Persistence API 的核心。休眠是使用最广泛的 JPA 实现。
- 程序最重要的方面之一是与数据库的连接。数据库连接和与数据库的事务被认为是最昂贵的事务。 ORM 在这方面是一个非常重要的工具。 ORM 有助于用 java 对象表示数据库的关系。
- ORM 由两个概念组成面向对象和关系编程。
- Hibernate 是一个 ORM 框架,程序员可以在其中描述对象在数据库中的表示方式。 Hibernate 自动处理转换。
- Hibernate提供JPA接口的实现
EntityManagerFactory
and EntityManager
.
- EntityManagerFactory 提供 EntityManager 实例用于连接到同一数据库。所有实例都配置为使用默认实现定义的相同设置。可以准备多个实体管理器工厂来连接到不同的数据存储。
- JPA EntityManager 用于访问特定应用程序中的数据库。它用于管理持久实体实例、通过主键标识查找实体以及查询所有实体。
JPA EntityManager 由以下一组方法支持。为了更好的可读性,我没有提到方法参数。
- persist - 使实例受管理且持久。
- merge - 将给定实体的状态合并到当前的持久性上下文中。
- 删除 - 删除实体实例。
- find - 按主键查找。搜索指定类和主键的实体。如果实体实例包含在持久性上下文中,则从那里返回它。
- getReference – 返回延迟获取的实例,并在第一次访问该实例时抛出 EntityNotFoundException。
- 刷新 – 将持久性上下文与数据库同步。
- setFlushMode – 设置持久化上下文的所有对象的刷新模式。
- getFlushMode – 获取持久化上下文中所有对象的刷新模式。
- lock - 使用指定的锁定模式类型锁定持久性上下文中包含的实体实例。
- 刷新 - 它从数据库刷新实例的状态,也会覆盖对实体的更改。
- 清除 - 清除持久性上下文,导致所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会被持久化。
- detach——这与clear方法类似,唯一不同的是之前引用分离对象的实体将继续这样做。
- contains – 它检查托管实体是否属于当前的持久性上下文。
- getLockMode – 获取实体实例的当前锁定模式。
- setProperty – 设置实体管理器属性或提示。
- getProperties – 获取与实体管理器关联的属性和提示。
- createQuery - 创建 Query 实例以执行 Java 持久性查询语言语句。
- 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 示例项目来看看一些方法。
We will create a maven project for JPA Hibernate EntityManager example, below image illustrates different component of our Eclipse project. 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 用法的示例。
我们必须在 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最重要的部分是提供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 目录中,从项目图片中可以看到。
我们现在将创建一个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
file
-
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=?
请注意,当员工 ID 保存到数据库中并映射回对象时,它是如何生成的。另请注意 SQL 查询被打印到控制台中。请注意,Hibernate 会创建更多日志,但为了保持可读性,我没有将它们放在这里。这就是 JPA EntityManager 的全部内容,并且是 hibernate 实现的示例。您可以从下面的链接下载最终的 Hibernate EntityManager 示例项目。
下载 JPA Hibernate EntityManager 示例项目
参考:API Doc