You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Persistence.createEntityManagerFactory报错排查:找不到名为ansattPersistenceUnit的EntityManager持久化提供者

No Persistence provider for EntityManager named ansattPersistenceUnit

我正在跟随视频教程中的老师进行学习,目前编写的代码如下:

public static void main(String[] args) { 
    String jpql = "SELECT p FROM ansatt p"; 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("ansattPersistenceUnit"); 
    EntityManager em = emf.createEntityManager(); 
    System.out.println("Kobler til database..."); 
    try { 
        TypedQuery<Ansatt> query = em.createQuery(jpql, Ansatt.class); 
        List<Ansatt> ansatte = query.getResultList(); 
        for(Ansatt p : ansatte) { 
            System.out.println("ID: " + p.getAnsNr()); 
        } 
    } finally { 
        em.close(); 
    } 
    System.out.println("Ferdig!"); 
}

运行后抛出了这个错误:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named ansattPersistenceUnit 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
at StartHere.main(StartHere.java:15)

请问我遗漏了哪些必要的配置或步骤?


问题分析与解决步骤

这个错误我之前刚踩过坑,本质上是JPA找不到你定义的持久化单元配置,咱们一步步排查:

1. 先检查persistence.xml的位置

JPA要求这个核心配置文件必须放在classpath下的META-INF文件夹里:

  • 如果是Maven/Gradle项目,要放在src/main/resources/META-INF下
  • 普通Java项目的话,放在src/META-INF目录
    编译后一定要确认这个文件出现在输出目录的META-INF里,不然JPA根本找不到它。

2. 确保persistence.xml内容正确

文件里必须定义名为ansattPersistenceUnit的持久化单元,还要指定持久化提供者(比如Hibernate)和数据库连接信息,给你一个可用的示例:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
             version="2.2">
    <!-- 这里的name必须和代码里的完全一致,大小写敏感! -->
    <persistence-unit name="ansattPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <!-- 指定Hibernate作为持久化提供者,如果你用EclipseLink就换对应的类 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 关联你的Ansatt实体类,或者用<exclude-unlisted-classes>false</exclude-unlisted-classes>自动扫描所有实体 -->
        <class>com.yourpackage.Ansatt</class>
        <properties>
            <!-- 数据库驱动,根据你用的数据库改,比如MySQL、PostgreSQL -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <!-- 数据库连接URL,替换成你的数据库地址和库名 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/your_db_name"/>
            <!-- 数据库用户名和密码 -->
            <property name="javax.persistence.jdbc.user" value="your_username"/>
            <property name="javax.persistence.jdbc.password" value="your_password"/>
            <!-- Hibernate的额外配置,可选但实用 -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

3. 确认项目依赖没少

如果用Maven,得把JPA API和持久化提供者的依赖加上,比如Hibernate的依赖配置:

<dependencies>
    <!-- JPA核心API -->
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>
    <!-- Hibernate核心包,作为持久化提供者 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.15.Final</version>
    </dependency>
    <!-- 数据库驱动,比如MySQL的 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>

如果是手动导入jar包,要确保JPA API、Hibernate核心包、数据库驱动这几个jar都在classpath里。

4. 检查实体类的注解

你的Ansatt类必须加上@Entity注解,主键字段要加@Id,不然JPA识别不了它是实体:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "ansatt") // 如果表名和类名一样可以省略这个注解
public class Ansatt {
    @Id // 标记主键字段
    private int ansNr;
    
    // 其他字段、getter和setter方法
    public int getAnsNr() {
        return ansNr;
    }
    
    public void setAnsNr(int ansNr) {
        this.ansNr = ansNr;
    }
}

5. 最后核对持久化单元名称

代码里Persistence.createEntityManagerFactory("ansattPersistenceUnit")的名称,一定要和persistence.xml里<persistence-unit name="ansattPersistenceUnit">的name完全一致,大小写不能错!

按照上面的步骤走一遍,应该就能解决这个问题了。


内容的提问来源于stack exchange,提问作者RainMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:37:42