在Bean中使用EntityManager时遇初始化失败及持久化提供者缺失错误
碰到这个问题我太熟了!核心就是JPA容器找不到你配置的那个名为Assignment3JPAProvider的持久化单元,咱们从几个常见的排查方向入手:
先确认persistence.xml的“安家位置”对不对
这个配置文件必须老老实实待在src/main/resources/META-INF(Maven/Gradle项目)或者Web项目的WEB-INF/classes/META-INF目录下,文件名也必须是persistence.xml——大小写、路径一个都不能错。我之前就犯过把META-INF写成MetaInf的低级错误,结果容器直接忽略了整个配置。检查持久化单元名称的“拼写一致性”
错误里明确说找不到Assignment3JPAProvider,你得确保persistence.xml里的<persistence-unit name="Assignment3JPAProvider">这个名称,和你代码里调用EntityManagerFactory时用的名字完全一致——大小写、连字符、甚至下划线都不能差半分。比如代码里要是写了Persistence.createEntityManagerFactory("assignment3jpaprovider")(全小写),肯定匹配失败。手动指定持久化提供者,别让容器瞎猜
很多时候容器自动检测提供者会“掉链子”,不如直接在persistence-unit里明确指定。比如用Hibernate的话,就加一行:<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>用EclipseLink的话就是:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>确认JPA实现的依赖已经“到位”
如果是Maven项目,检查pom.xml里有没有引入对应JPA实现的依赖,比如Hibernate的核心依赖:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>你的具体版本号</version> </dependency>要是Web项目,还要确保这些依赖已经打包到WAR的
WEB-INF/lib里,或者服务器的全局lib目录中——运行时找不到提供者的类文件,肯定会报这个错。检查persistence.xml的XML语法有没有“暗病”
你给出的XML开头看起来没问题,但要确保整个文件没有语法错误,比如标签没闭合、命名空间写错、schema路径不对。可以用IDE的XML校验功能扫一遍,有时候一个不起眼的语法错误,就会导致整个配置无法被解析。
给你贴个正确的persistence.xml示例参考:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" 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_1.xsd"> <persistence-unit name="Assignment3JPAProvider" transaction-type="JTA"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <jta-data-source>java:jboss/datasources/YourDataSource</jta-data-source> <class>com.yourpackage.YourEntityClass</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> <property name="hibernate.show_sql" value="true"/> </properties> </persistence-unit> </persistence>
内容的提问来源于stack exchange,提问作者DanC12

