举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > jpa entitymanager JPA 实体管理器

jpa entitymanager JPA 实体管理器

2023-06-05 23:18 Java教程

jpa entitymanager JPA 实体管理器

jpa entitymanager

JPA EntityManager是一个接口,它提供了对Java Persistence API(JPA)的访问。它是一个用于管理持久性对象的重要工具,可以用来执行CRUD操作(创建、读取、更新和删除)。

EntityManager是一个重要的组件,它负责管理实体对象之间的关系。它还可以用来执行JPQL查询(Java Persistence Query Language)并将结果映射到实体对象上。

EntityManager还可以用来处理事务。当使用EntityManager时,必须在开始事务之前启动它。然后在事务中执行CRUD操作或JPQL查询。最后,必须在事务结束时提交或回滚事务。

 
// 创建 EntityManagerFactory 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit"); 
// 创建 EntityManager 
EntityManager em = emf.createEntityManager(); 
// 启动事务 
em.getTransaction().begin(); 
// 执行 CRUD 操作或 JPQL 查询 
... 
// 提交或回滚事务 
em.getTransaction().commit(); 
// 关闭 EntityManager 
em.close();   

JPA 实体管理器

实体管理器概述

实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。

实体的四种状态

在此之前我们要先了解实体的状态及其转换,见下图

JPA 实体生命周期有四种状态

  • 新建状态(New):对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将丢失。
  • 托管状态(Managed):对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时候数据库中有对象的信息,改对象的id为数据库中对应记录的主键值。由于还在 Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。
  • 游离状态(Datached):是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出延迟加载异常。
  • 删除状态(Removed):删除的对象,有id值,尚且和 Persistence  Context 有关联,但是已经准备好从数据库中删除。

创建实体管理器

所有实体管理器都来自类型​javax.persistence.EntityManagerFactory​的工厂。

以下示例演示为名为“EmployeeService”的持久性单元创建一个​EntityManagerFactory​:

EntityManagerFactory emf = 
    Persistence.createEntityManagerFactory("EmployeeService");

以下示例演示如何在上一个示例中获取的工厂创建实体管理器:

EntityManager em = emf.createEntityManager();

保存实体

我们使用实体管理器来持久化​Employee​的实例。

Employee emp = new Employee(158);
em.persist(emp);

以下代码显示如何在创建新员工并将其保留到数据库的方法中使用​EntityManager​。

public Employee createEmployee(int id, String name, long salary) {
    Employee emp = new Employee(id);
    emp.setName(name);
    emp.setSalary(salary);
    em.persist(emp);
    return emp;
}

查找实体

一旦实体在数据库中,下一行代码显示如何找到它。

Employee emp = em.find(Employee.class, 1);

删除实体

要从数据库中删除实体,请从​EntityManager​调用​remove​方法。

Employee emp = em.find(Employee.class, 1);
em.remove(emp);

更新实体

要更新实体,我们可以在被管实体上调用​setter​方法。被管实体是从​EntityManager​返回的实体。

Employee emp = em.find(Employee.class, 1);
emp.setName("new Name");

事务

以下代码显示如何启动和提交事务。

em.getTransaction().begin(); Employee emp = new Employee(158); em.persist(emp); em.getTransaction().commit();

查询

在​JPA​中,有一种称为​Java​持久性查询语言(JP QL)的新的查询语言。

以下示例显示如何创建动态查询,然后执行它以获取数据库中的所有员工。

TypedQuery<Employee> query = 
     em.createQuery("SELECT e FROM Employee e",
                     Employee.class);
List<Employee> emps = query.getResultList();

我们通过在​EntityManager​上发出​createQuery()​调用并传入 JP QL 字符串来创建一个​TypedQuery<Employee>​对象。

JP QL 字符串不是指​EMPLOYEE​数据库表,而是Employee实体。

例子

以下代码显示了一个简单的完全功能类,可用于对​Employee​实体发出典型的创建,读取,更新和删除(CRUD)操作。

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

public class EmployeeService {
  protected EntityManager em;

  public EmployeeService(EntityManager em) {
    this.em = em;
  }

  public Employee createEmployee(int id, String name, long salary) {
    Employee emp = new Employee(id);
    emp.setName(name);
    emp.setSalary(salary);
    em.persist(emp);
    return emp;
  }

  public void removeEmployee(int id) {
    Employee emp = findEmployee(id);
    if (emp != null) {
      em.remove(emp);
    }
  }

  public Employee raiseEmployeeSalary(int id, long raise) {
    Employee emp = em.find(Employee.class, id);
    if (emp != null) {
      emp.setSalary(emp.getSalary() + raise);
    }
    return emp;
  }

  public Employee findEmployee(int id) {
    return em.find(Employee.class, id);
  }

  public List<Employee> findAllEmployees() {
    TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e",
        Employee.class);
    return query.getResultList();
  }
}

主类

import java.util.List;

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

public class Main {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence
        .createEntityManagerFactory("EmployeeService");
    EntityManager em = emf.createEntityManager();
    EmployeeService service = new EmployeeService(em);

    em.getTransaction().begin();
    Employee emp = service.createEmployee(1, "Tom", 5000);
    em.getTransaction().commit();
    System.out.println("Persisted " + emp);

    emp = service.findEmployee(1);
    System.out.println("Found " + emp);

    List<Employee> emps = service.findAllEmployees();
    for (Employee e : emps)
      System.out.println("Found employee: " + e);

    em.getTransaction().begin();
    emp = service.raiseEmployeeSalary(1, 1000);
    em.getTransaction().commit();
    System.out.println("Updated " + emp);

    em.getTransaction().begin();
    service.removeEmployee(158);
    em.getTransaction().commit();
    System.out.println("Removed Employee 158");

    em.close();
    emf.close();
  }
}

持久性单元

描述持久性单元的配置在名为 persistence.xml 的XML文件中定义。

每个持久性单元都被命名。单个 persistence.xml 文件可以包含一个或多个命名的持久性单元配置。

以下代码显示了 persistence.xml 文件的演示

<persistence>
   <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
      <properties>
         <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
         <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
         <property name="javax.persistence.jdbc.user" value="APP"/>
         <property name="javax.persistence.jdbc.password" value="APP"/>
      </properties>
   </persistence-unit>
</persistence>

persistence.xml 文件应放在 META-INF 目录中。


阅读全文
以上是编程学为你收集整理的jpa entitymanager JPA 实体管理器全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • java字符类型 Java 字符

    java字符类型 Java 字符

    2023-03-05 Java教程

    Java教程 -Java字符在Java中,char存储字符。Java使用Unicode来表示字符。Unicode可以表示在所有人类语言中找到的所有字符。Java...

  • Java线程中断 Java 线程中断

    Java线程中断 Java 线程中断

    2023-03-23 Java教程

    Java线程教程 -Java线程中断我们可以通过使用interrupt()方法中断一个活动的线程。这个方法调用在线程只是一个指示。它是由线程...

  • java float类型 Java float数据类型

    java float类型 Java float数据类型

    2023-04-25 Java教程

    Java数据类型教程 -Java float数据类型浮点数据类型当评估需要分数精度的表达式时,使用浮点数(也称为实数)。包含小数部分的数...

  • javaif语句的用法例子 Java If语句

    javaif语句的用法例子 Java If语句

    2023-03-08 Java教程

    Java教程 -Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statem...

  •  Java 8  新特性

    Java 8 新特性

    2023-05-17 Java教程

    Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部