使用 JPA 和 Hibernate 简化数据库操作:创建和持久化对象

217 阅读4分钟

通常 JPA 与 Spring/Spring Boot 和 Java EE/Jakarta EE 应用程序集成。这两个应用程序都提供了对 JPA 的抽象,它隐藏了很多我们需要在准系统 Java 应用程序中手动完成的事情。这种对 JPA 的抽象就像变魔术一样有效。但在这里我们要自己施展魔法。

设置数据库

首先,我们需要为我们的应用程序建立一个数据库。为了简单和开发目的,我们将使用 H2 数据库。H2可以用作内存数据库或服务模式。我们将使用服务器端模式来模拟真实的数据库。

图片描述

我们可以将 H2 数据库与任何其他关系数据库(如 MySQL、Postgres 或其他任何关系数据库)切换。

从官方网站下载并安装 H2 安装程序。安装后,如果您打开 H2 控制台,它会在浏览器中打开。你应该看到这样的东西。

图片描述
您设置您的用户名和密码,或者可以单击连接按钮,它将使用默认配置运行 H2 数据库。

图片描述

连接后,您应该会看到这样的页面。您可以在此处创建表和编写 SQL 查询。

创建 Java Maven 项目

如果您使用的是 IntelliJ Idea,请创建一个新的 Java maven 项目。项目构建完成后,在 pom.xml 文件中添加以下依赖项

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>5.6.15.Final</version>
</dependency>`

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.200</version>
  <scope>complete</scope>
</dependency>

第一个依赖项允许我们使用支持 JPA 的 hibernate 实现,第二个依赖项用于数据库驱动程序。在我们的例子中,它是一个 H2 数据库。如果您正在使用任何其他数据库,只需切换与相应数据库驱动程序的依赖关系。

持久性上下文

在 src → 资源包中创建 META-INF 目录。在该目录中创建一个persistence.xml文件。该文件称为持久性上下文。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <properties>
            <!-- Database connection properties -->
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>

            <!-- Hibernate properties -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>

它包含我们数据库的配置。连接方式、连接位置、用户名、密码等配置。如果您有使用 spring boot 的经验,它类似于application.properties文件。

我们将更详细地查看持久性上下文文件。现在,我们使用 JPA 的基本 Java 项目已准备好运行。 让我们创建一个只有两个字段 id 和 name 的 Student 类。

注意:类仅包含用于演示目的的成员变量。您需要添加适当的 getter 和 setter

public class Student {
  private int id;
  private String name;
}

为了让 JPA 知道我们希望这个 Java 类成为我们数据库中的一个表,我们将使用 JPA 接口提供的注释。

我们使用的第一个注解是 @Entity。这个注解告诉我们这个类与JPA有关,我们可以用这个类用JPA进行数据库操作。

@Entity
public class Student {
  private int id;
  private String name;
}

现在让我们准确地告诉 JPA 这个类需要映射到数据库中的哪个表。

为此,我们将使用 @Table注释。这个注解可以在里面带一些参数。

name 参数用于将其与数据库中的表进行映射。

@Entity
@Table(name = "Student _Table")
public class Student {
  private int id;
  private String name;
}

即使我们的数据库中还没有 Student_Table,JPA 也会创建一个。

由于我们正在处理关系数据库,因此每个表都需要一个主键。要将成员变量标记为表中的主键,我们使用 ***@id***注释。

@Entity
@Table(name = "Student _Table")
public class Student {
  @Id
  private int id;
  private String name;
}

就是这样,现在 id 成员变量是我们表的主键。在主类中,让我们创建一个学生对象以将其保存在数据库中。

public class Main {
  public static void args) {
      Student student = new Student();
      student.setld(1);
      student.setName("Sohail Shah");
  }
}

要使用 JPA 将这个学生对象保存在数据库中,我们需要一个实体管理器对象。我们从持久化类中的实体管理器工厂方法中获取这个实体管理器对象。

public class Main {
  public static void args) {
      Student student = new Student();
      student.setld(1);
      student.setName("Sohail Shah");
      EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myPersistenceUnit");
      EntityManager entityManager = entityManagerFactory.createEntityManager();
  }
}

createEntityManagerFactory 方法采用我们在持久性上下文文件中创建的持久性单元名称。在我的例子中,它是 myPersistenceUnit,但它可以是任何东西。

现在我们可以在实体管理器上使用 persist 方法保存我们的学生对象。

entityManager.persist(student);

这就是我们将学生对象保存在数据库中所需要做的全部工作。但是我们需要用事务来包围我们的持续操作。事务应该在持久化操作之前开始,并在持久化操作之后关闭。

我们从实体管理器中得到一个事务对象。

EntityTransaction transaction = entityManager.getTransaction();

使用事务对象来包围持久化操作,我们将有

EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(student);
transaction.commit();
entityManager.close();
entityManagerFactory.close();

现在,如果我们运行我们的应用程序,并检查数据库,我们可以看到我们的学生对象实际上已被保存。

图片描述

我们不必编写任何 SQL 查询来将数据插入表中。作为 Java 开发人员,我们一直在处理对象,这真是太棒了。

这是完整的主类:

public class Main {
  public static void args) {
      //Creating a student object
      Student student = new Student();
      student.setld(1);
      student.setName("Sohail Shah");
      //Creating a entity manager factory object
      EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myPersistenceUnit");
      //creating entity manager using the entity manager factory
      EntityManager entityManager = entityManagerFactory.createEntityManager();
      //creating a transaction object using the entity manager
      EntityTransaction transaction = entityManager.getTransaction();
      //beginning the transaction
      transaction.begin();
      //Persisting the student object
      entityManager.persist(student);
      //committing the transaction
      transaction.commit();
      //closing the entity manager
      entityManager.close();
      //closing the entity manager factory
      entityManagerFactory.close();
    }
}