JPA 实体管理器 - Hibernate 实体管理器

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

JPA实体管理员

  • 联合国 一个程序最重要的方面之一是连接数据库. 数据库连接和与数据库的交易被认为是最昂贵的交易. 在这方面,ORM是一个非常重要的工具。 ORM帮助以java对象表示数据库的关系. (_)
  • ORM由两个概念面向对象和关系编程 组成. Hibernate是一个ORM框架,程序员描述对象在数据库中的表达方式. 休眠自动处理转换( _) ( ) Hibernate提供JPA接口实体管理Factory实体管理Factory的执行。 () ( )* 实体管理员 Factory提供了实体管理员连接到同一数据库的实例. 所有实例都被配置为使用默认执行定义的相同设置. 几个实体经理工厂可以准备连接到不同的数据库。 () ( )* 联合行动计划 实体管理器用于访问特定应用程序中的数据库。 该系统用于管理持续存在的实体实例,根据其主要关键身份找到实体,并对所有实体进行查询。 (单位:千美元) (英语)

JPA EntityManager 方法

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

  1. 持久性 -- -- 使实例得到管理和持续。 (_) )2. 合并 - 将给定实体的状态合并到当前持久性上下文.
  2. 删除 - 删除实体实例 。 (_)
  3. 查找 - 按主键查找. 搜索指定类和主密钥的实体 。 如果实体实例包含在持久性上下文中,则从中返回。 5。 getReference - 返回和实例,这些返回和实例是懒散取取的,并将在首次访问时抛出实体NotFoundExcuseion。 (_)
  4. slush – 将持久性上下文与数据库同步. (_) ) 7. 设置 FlushMode – 为持久性上下文的所有对象设置冲洗模式.
  5. 获取FlushMode – 获取持久上下文所有对象的冲出模式 。 () (英语). 9. 锁定 - 用指定的锁定模式类型锁定一个包含在持久性上下文中的实体实例。 () ) 10. 刷新 – 从数据库中刷新实例状态, 并覆盖实体的更改 。 () )11. Clear - 清除持久性上下文,使所有被管理的实体脱落. 对尚未冲入数据库的实体作出的修改将不会继续下去。 () )12. detach – 这与清晰的方法类似,只有添加的是先前引用被剥离对象的实体会继续这样做.
  6. 包含–它检查被管理的实体是否属于当前持久性上下文. () )14. getLockMode – 为实体获取当前锁定模式。 () )15. set Property – 设置实体管理器属性或提示. (_) )16. 获取Properties – 获取与实体管理器相关的属性和提示.
  7. Create Query - 为 Java 持久性查询语言语句执行创建查询实例 。 () )18 (英语). 创建NamedQuery - 创建用于执行名为查询语言语句的 Java 持久性的查询实例 。 () )19. CreateNativeQuery - 为本地 sql 语句执行创建查询实例. () )20 (英语). 创建NamedStoredProceedureQuery - 创建 StoredProceedureQuery 实例,用于执行数据库中存储的程序. () )21 (英语). 创建StoredProceedureQuery - 创建 StoredProceedureQuery 实例,用于执行数据库中存储的程序. () )22. 加入 Transportaction - 向实体管理者说明JTA交易是活动的. 这种方法应当借助于在活动交易范围之外创建的JTA应用程序管理实体管理器,将其与当前JTA交易联系起来. () )23. 是 JoinedTo Transportaction — 它决定实体是否 管理器与当前交易相连( _) )24. unwrap - 返回指定类型的对象,允许访问提供者特定的API
  8. getDelegate – 为实体Manager返回提供者对象. () )26 (英语). 关闭 – 关闭应用程序管理的实体Manager. () )27 (英语). 打开 - 决定实体 管理器已打开( ) )28 (英语). 获取交易 - 返回资源级实体交易对象 。 () )29. 获得实体管理器 工厂 - 为实体经理提供实体经理工厂。 () ) 30. getCriteriaBuilder - 返回标准Builder的一例创建标准查询对象. () )31. get Metamodel - 返回一个元模界面实例,用于访问持久性单位的元模.
  9. CreatetityGraph - 返回一个可变实体Graph,用于动态创建实体Graph. (_)
  10. 获取实体 图表 - 返回一个命名的实体 图

让我们看看通过 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.

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

这是一个非常简单的表,但适合我们的例子来展示 EntityManager 的使用。

冬眠 Maven 依赖性

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

 1<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
 2    xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 3    <modelVersion>4.0.0</modelVersion>
 4
 5    <groupId>com.journaldev.hibernate</groupId>
 6    <artifactId>hibernate-entitymanager</artifactId>
 7    <version>0.0.1-SNAPSHOT</version>
 8    <packaging>jar</packaging>
 9
10    <name>hibernate-entitymanager</name>
11    <url>https://maven.apache.org</url>
12
13    <properties>
14    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15    </properties>
16
17    <dependencies>
18    	<!-- MySQL connector -->
19    	<dependency>
20    		<groupId>mysql</groupId>
21    		<artifactId>mysql-connector-java</artifactId>
22    		<version>6.0.5</version>
23    	</dependency>
24    	<!-- Hibernate 5.2.6 Final -->
25    	<dependency>
26    		<groupId>org.hibernate</groupId>
27    		<artifactId>hibernate-core</artifactId>
28    		<version>5.2.6.Final</version>
29    	</dependency>
30    	<dependency>
31    		<groupId>junit</groupId>
32    		<artifactId>junit</artifactId>
33    		<version>3.8.1</version>
34    		<scope>test</scope>
35    	</dependency>
36    </dependencies>
37
38    <build>
39    	<sourceDirectory>src/main/java</sourceDirectory>
40    	<plugins>
41    		<plugin>
42    			<artifactId>maven-compiler-plugin</artifactId>
43    			<version>3.5.1</version>
44    			<configuration>
45    				<source>1.8</source>
46    				<target>1.8</target>
47    			</configuration>
48    		</plugin>
49    	</plugins>
50    </build>
51</project>

.xml

使用 hibernate 的最重要部分是提供 persistence.xml 文件. 此 xml 包含连接到数据库的配置。

 1<persistence xmlns="https://xmlns.jcp.org/xml/ns/persistence"
 2    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
 3    xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/persistence
 4             https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
 5    version="2.1">
 6
 7    <persistence-unit name="persistence">
 8    	<description>Hibernate Entity Manager Example</description>
 9    	<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
10
11    	<properties>
12    		<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
13    		<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Test" />
14    		<property name="javax.persistence.jdbc.user" value="journaldev" />
15    		<property name="javax.persistence.jdbc.password" value="journaldev" />
16    		<property name="hibernate.show_sql" value="true" />
17    	</properties>
18
19    </persistence-unit>
20
21</persistence>
  • hibernate.show_sql 用于告诉 hibernate 将 sql 查询打印到日志文件或控制台
  • 最重要的配置是 provider 类,即 org.hibernate.jpa.HibernatePersistenceProvider. 这就是 Hibernate 如何连接到我们的应用程序以作为 JPA 实现
  • 有属性连接到您的数据库和驱动程序使用
  • 重要的是要注意到 persistence.xml 应该放在 META-INF 目录中,正如您可以从项目图像中看到的那样。

Hibernate 实体 Bean

现在我们将创建一个Employee.java类,该类将与数据库中创建的员工表相匹配。

 1package com.journaldev.jpa.hibernate.model;
 2
 3import javax.persistence.Column;
 4import javax.persistence.Entity;
 5import javax.persistence.GeneratedValue;
 6import javax.persistence.GenerationType;
 7import javax.persistence.Id;
 8import javax.persistence.Table;
 9
10@Entity
11@Table(name = "employee")
12public class Employee {
13    private int employeeId;
14
15    private String name;
16
17    @Id
18    @Column(name = "employee_id")
19    @GeneratedValue(strategy = GenerationType.IDENTITY)
20    public int getEmployeeId() {
21    	return employeeId;
22    }
23
24    public void setEmployeeId(int employeeId) {
25    	this.employeeId = employeeId;
26    }
27
28    @Column(name = "employee_name")
29    public String getName() {
30    	return name;
31    }
32
33    public void setName(String name) {
34    	this.name = name;
35    }
36
37    @Override
38    public String toString() {
39    	return "Employee [employeeId=" + employeeId + ", name=" + name + "]";
40    }
41
42}

现在是时候创建我们的主要程序,并使用 EntityManager 方法运行一些查询了。

 1package com.journaldev.jpa.hibernate.main;
 2
 3import java.util.List;
 4
 5import javax.persistence.EntityManager;
 6import javax.persistence.EntityManagerFactory;
 7import javax.persistence.Persistence;
 8
 9import com.journaldev.jpa.hibernate.model.Employee;
10
11public class App {
12    public static void main(String[] args) {
13    	EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
14    	EntityManager entityManager = entityManagerFactory.createEntityManager();
15
16    	System.out.println("Starting Transaction");
17    	entityManager.getTransaction().begin();
18    	Employee employee = new Employee();
19    	employee.setName("Pankaj");
20    	System.out.println("Saving Employee to Database");
21
22    	entityManager.persist(employee);
23    	entityManager.getTransaction().commit();
24    	System.out.println("Generated Employee ID = " + employee.getEmployeeId());
25
26    	// get an object using primary key.
27    	Employee emp = entityManager.find(Employee.class, employee.getEmployeeId());
28    	System.out.println("got object " + emp.getName() + " " + emp.getEmployeeId());
29
30    	// get all the objects from Employee table
31    	@SuppressWarnings("unchecked")
32    	List<Employee> listEmployee = entityManager.createQuery("SELECT e FROM Employee e").getResultList();
33
34    	if (listEmployee == null) {
35    		System.out.println("No employee found . ");
36    	} else {
37    		for (Employee empl : listEmployee) {
38    			System.out.println("Employee name= " + empl.getName() + ", Employee id " + empl.getEmployeeId());
39    		}
40    	}
41    	// remove and entity
42    	entityManager.getTransaction().begin();
43    	System.out.println("Deleting Employee with ID = " + emp.getEmployeeId());
44    	entityManager.remove(emp);
45    	entityManager.getTransaction().commit();
46
47    	// close the entity manager
48    	entityManager.close();
49    	entityManagerFactory.close();
50
51    }
52}
  1. 持久性.创建实体管理者档案 ' 将使用我们在持久性.xml ' 文件(- )中提供的持久性-单位 ' 提供实体管理者档案。 2.实体管理者档案.创建实体管理者档案 ' 将创造实体管理者档案。 每次我们称为创建实体管理器( ) 方法时, 它都会返回一个新的实体管理器实例 。 ( ) )3. `实体管理器.get Transportaction (. begin ()' 方法首先将交易从当前持久性上下文中拉出,然后使用起始()方法开始交易. ()
  2. 实体管理者.persist(雇员)'用于使数据库中的员工对象持久化。 (_) )5. 实体管理器.getTransaction.commit ()' 方法用于获取交易,然后进行同一交易。 这将将所有更改输入数据库。 (_) )6. `实体管理器.find ()'用于在数据库中找到使用主键的实体.
  3. 如果您想写自定义查询, 我们可以使用 实体管理器. 创建查询 方法 。 这里需要注意的重要一点是,创建查询()的方法会在实体类中给出名称,而不是实际的表格名称. (_) )8. 实体管理者.remove ()'只应在我们必须从数据库中删除一个实体时使用。 (_) )9. 实体经理.close ()'用于关闭实体经理。 同样,实体经理Factory.close ()'是关闭实体经理Factory'。 我们一旦完成这项工作,就应关闭这些资源。 (单位:千美元) (英语)

下面是从上面的程序的一个样本运行中产生的输出。

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

请注意,员工ID是如何生成的,当它被保存到数据库,然后重新绘制到对象时。 还注意到 sql 查询被打印到控制台中。 请注意,Hibernate 将创建更多的日志,但我没有把它们放在这里以保持可读性。

下载 JPA Hibernate EntityManager 示例项目

引用: API Doc

Published At
Categories with 技术
Tagged with
comments powered by Disqus