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
相关产品推荐
相关产品推荐

