Java如何创建JPA EntityManagerFactory?

在此代码段中,您将学习如何创建JPA EntityManagerFactory。该工厂使您能够创建EntityManager用来执行JPA命令来操纵数据库表的。

要创建文件,EntityManagerFactory您需要先创建persistence.xml文件。该文件是您配置JPA的位置。该文件必须放在META-INF程序工作目录的目录中。

这是persistence.xml文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="music" transaction-type="RESOURCE_LOCAL">
        <class>org.nhooo.example.jpa.entity.Artist</class>
        <class>org.nhooo.example.jpa.entity.Genre</class>
        <class>org.nhooo.example.jpa.entity.Label</class>
        <class>org.nhooo.example.jpa.entity.Record</class>
        <class>org.nhooo.example.jpa.entity.Review</class>
        <class>org.nhooo.example.jpa.entity.Reviewer</class>
        <class>org.nhooo.example.jpa.entity.Track</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/musicdb"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL55Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>

</persistence>

persistence.xml文件中定义的持久性单元包含一组实体对象。我们还定义了一些与数据库连接有关的属性,包括JDBC驱动程序类,JDBC URL,用于打开与数据库的连接的用户名和密码。

定义persistence.xml文件后,我们将创建一个简单的程序来创建EntityManagerFactory。要创建工厂,我们可以使用javax.persistence.PersistenceclasscreateEntityManagerFactory()方法并将持久性单元名称作为参数传递。在此示例中,持久性单元名称music如persistence.xml文件中所示。

创建工厂对象后,我们可以EntityManager通过调用工厂对象来创建createEntityManager()。让我们看看下面的代码片段。

package org.nhooo.example.jpa;

import org.nhooo.example.jpa.entity.Artist;

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

public class EntityManagerFactoryExample {
    public static final String PERSISTENCE_UNIT_NAME = "music";

    public static void main(String[] args) {
        EntityManagerFactory factory =
            Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager manager = factory.createEntityManager();

        // 对实体管理器执行一些操作。
        Artist artist = manager.find(Artist.class, 1L);
        System.out.println("artist = " + artist);
    }
}

Artist实体类定义。

package org.nhooo.example.jpa.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

@Entity
@Table(name = "artists")
public class Artist implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "name", length = 100, nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Artist artist = (Artist) o;
        return Objects.equals(id, artist.id) &&
            Objects.equals(name, artist.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
        return "Artist{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
    }
}

我们的项目目录结构。

├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── nhooo
        │           └── example
        │               └── jpa
        │                   ├── EntityManagerFactoryExample.java
        │                   └── entity
        │                       ├── Artist.java
        │                       ├── Genre.java
        │                       ├── Label.java
        │                       ├── Record.java
        │                       ├── Review.java
        │                       ├── Reviewer.java
        │                       └── Track.java
        └── resources
            └── META-INF
                └── persistence.xml

Maven依赖

<dependencies>
    <!-- https://search.maven.org/remotecontent?filepath=javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar -->
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>
    <!-- https://search.maven.org/remotecontent?filepath=org/hibernate/hibernate-core/5.4.1.Final/hibernate-core-5.4.1.Final.jar -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.4.1.Final</version>
    </dependency>
    <!-- https://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>

Maven中央
Maven中央
Maven中央